Scrapy中的那些问题
最近写python时遇到了一些问题,网上也不好找,记下来以后要是忘了能够看看
问题一:
from pharm import items
这句话出问题,cannot import module item
问题是class pharmspider(CrawlSpider):
不能写成class DmozSpider(scrapy.Spider):
继承CrawlSpider可以,也可以是BaseSpider,就是不能是scrapy.Spider,有时间查查原因。
问题2
Python在读取txt文件的时候总是乱码,因为不管文件格式是什么编码的,scrapy总是默认按照ascii编码来读取,可以采用这种方法来判断字符的编码方式
from pip._vendor.requests.packages importchardet
print chardet.detect('asdfasd')
显示结果:
{'confidence': 1.0, 'encoding': 'ascii'}
问题3
在网页抓取的时候总是抓到的东西是乱码的,因为有的网页不是utf-8的。这个时候需要在网页源代码中寻找到对应的编码方式,然后先按照这个方式解码,在进行编码
a=response.body.decode('gb2312').encode('utf-8')
问题3
我想写一个从txt文件读取信息,进而生成CSV文件的程序,怎么匹配都不对,实在没办法后来用了函数repr(),它可以看出字符在内存中的真实表示:
import csv
file =open("C:\common.txt",'r')
a=file.readline()
print a
print type(a)
b='首页 - 药物应用数据库'
print repr(b)
print repr(a)
if a==b:
print a
else:
print '1'
首页 - 药物应用数据库
<type 'str'>
'\xef\xbb\xbf\xe9\xa6\x96\xe9\xa1\xb5- \xe8\x8d\xaf\xe7\x89\xa9\xe5\xba\x94\xe7\x94\xa8\xe6\x95\xb0\xe6\x8d\xae\xe5\xba\x93'
'\xef\xbb\xbf\xe9\xa6\x96\xe9\xa1\xb5-\xe8\x8d\xaf\xe7\x89\xa9\xe5\xba\x94\xe7\x94\xa8\xe6\x95\xb0\xe6\x8d\xae\xe5\xba\x93\n'
1
原来是文件中读取的字符多了一个\n!!!
问题4:
Win系统中文字第一行一定是关于文件的编码声明的,然而utf不需要这个声明,如果按照utf读取文件就会发生读取错误,utf关于这个声明无法读取。
此时应当做的是将第一行删去,或者
因为BOM头有三个字节
content = file[3:] #排除吊BOM头,一直就是它搞的鬼!!!
BOM也是一行的:
lines = codecs.open('C:\common.txt','r',"utf-8").readlines()
lines = lines[1:]
问题5:
如何从一个txt读取生成csv文件
只需要在parse函数里面写上:
defparse(self, response):
lines =codecs.open('C:\common.txt','r',"utf-8").readlines()
lines = lines[1:]
for num in range(len(lines)):
if lines[num]==u"药物类别:\r\n":
item=items.PharmItem()
item['ywlb']=lines[num+1]
print item['ywlb']
continue
if lines[num]==u"所属类别:\r\n":
item['sslb']='11'
continue
if lines[num]==u"药物名称:\r\n":
item['ywmc']=lines[num+1]
continue
if lines[num]==u"英文名称:\r\n":
item['yingyu']=lines[num+1]
continue
if lines[num]==u"药物别名:\r\n":
item['ywbm']=lines[num+1]
continue
if lines[num]==u"药理作用:\r\n":
item['yaoli']=lines[num+1]
continue
if lines[num]==u"药动学:\r\n":
item['yaodong']=lines[num+1]
continue
if lines[num]==u"适应症:\r\n":
item['shiying']=lines[num+1]
continue
if lines[num]==u"用法用量:\r\n":
item['yongfa']=lines[num+1]
continue
if lines[num]==u"不良反应:\r\n":
item['buliang']=lines[num+1]
continue
if lines[num]==u"相互作用:\r\n":
item['xianghu']=lines[num+1]
continue
if lines[num]==u"注意事项:\r\n":
item['zhuyi']=lines[num+1]
continue
if lines[num]==u"疗效评价:\r\n":
item['liaoxiao']=lines[num+1]
yield item
这样就能提取出来了,这是scrapy框架里面的parse函数
问题8:
Spider not find: spidername
没有找到spider
1. 先确认spiders文件夹中的工程里面是否有name属性
2. Settings.py文件中的BOT_NAME属性一般和projectname相同,也就是name属性
3. 在cfg文件中查看配置是否错误default = drug.settings ,cfg文件和整个项目的文件时并列的
4.