Python 使用Scrapy从网页下载文本会导致错误,并且文本存储不正确
我正在使用Scrapy crawler从属于不同公司的一些网页下载文本,并使用utf-8编码和以下格式将文本存储在csv文件中 “公司”、“公司编号”、“提取文本” 我的问题是,无论我如何尝试考虑网页字符编码,我总是会得到很多这种类型的UnicodeErrorPython 使用Scrapy从网页下载文本会导致错误,并且文本存储不正确,python,text,encoding,utf-8,scrapy,Python,Text,Encoding,Utf 8,Scrapy,我正在使用Scrapy crawler从属于不同公司的一些网页下载文本,并使用utf-8编码和以下格式将文本存储在csv文件中 “公司”、“公司编号”、“提取文本” 我的问题是,无论我如何尝试考虑网页字符编码,我总是会得到很多这种类型的UnicodeError 2014-08-26 13:43:13+0200 [scrapy] INFO: Encoding for page http://militaryaircraftspares.net/index.html is cp1252 2014-0
2014-08-26 13:43:13+0200 [scrapy] INFO: Encoding for page http://militaryaircraftspares.net/index.html is cp1252
2014-08-26 13:43:13+0200 [scrapy] INFO: UNICODE ERROR, in http://militaryaircraftspares.net/index.html error is 'ascii' codec can't encode character u'\xa0' in position 478: ordinal not in range(128)
因此丢失了大量数据。
此外,我实现了一个使用CSViteExporter的管道的最后一个csv文件,它完全是乱七八糟的:总的来说,肯定有超过3列,而且我有一些提取的_文本在“company”或“company number”字段中结束。好像提取的_文本中的某些excape字符没有被正确识别,并在不需要的地方生成一行新行,至少我猜是这样。
我想我在某个地方做错了什么,但我不知道在哪里。。。
这是爬虫程序的功能,它应该完成这项工作
def extract_text(self, response):
""" extract text from webpage"""
#checks whether the page is actually html
if type(response) == scrapy.http.response.html.HtmlResponse:
hxs = HtmlXPathSelector(response)
page_text = ' '.join(hxs.select("//body//p//text()").extract())
current_encoding = response.encoding
log.msg("Encoding for page "+response.url+" is "+current_encoding)
item = CompanyText()
item['co_name'] = self.co_name.encode('utf-8')
item['co_number'] = self.co_number.encode('utf-8')
if current_encoding != 'utf-8':
try:
decoded_page = page_text.decode(current_encoding, errors='ignore')
encoded_page = decoded_page.encode("utf-8",errors="ignore")
item['extracted_text'] = encoded_page
except UnicodeError, e:
log.msg("UNICODE ERROR, in "+response.url+" error is %s" % e)
item['extracted_text'] = ''.encode('utf-8')
else:
item['extracted_text'] = page_text
else:
item = None
选择器的输出总是unicode,因此您应该加入unicode
这:
page_text=''.joinhxs.select//body//p//text.extract
应该是:
page_text=u“”。joinhxs.select//body//p//text.extract
因为页面文本是unicode
这是不需要的:
解码页面=页面文本。解码当前编码,错误='ignore'
编码页面=解码页面。编码UTF-8,错误=忽略
CsvExporter将尝试获取字段序列化程序,该程序是一个接收值作为参数的函数。我们的默认序列化程序是_to _str_if_unicode,并使用utf8作为编码
你确定你需要做任何编码/解码吗?不是所有的网页都是utf-8格式的。例如,我在错误中提到的一个例子是cp1252。正如@PadRaiccanningham所暗示的,我不建议对从选择器中获得的unicode字符串进行编码,我会将其留给CSV导出器,通常它会处理得很好。你是对的,我去掉了所有的编码和解码,将其全部留给CsvExporter。但是,我仍然在csv文件中看到了一些奇怪的行为,尽管没有以前那么多:好像它看到了一个不应该出现的结尾。我甚至通过拆分文本字符串,然后删除任何非字母数字的子字符串,去除了页面文本字符串中的所有特殊字符。但是问题仍然存在,csv文件不是我所期望的