Python 使用Scrapy从网页下载文本会导致错误,并且文本存储不正确

Python 使用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

我正在使用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-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文件不是我所期望的