我在Scrapy中编写了一个Spider,以从quotes.toscrape.com提取数据,但是当我将提取的数据导出到csv时,“(引号)会自动将其转换为类似â€
的字符这是在蜘蛛下编写的代码,可以在Windows计算机上的sublime text3上看到。
# -*- coding: utf-8 -*-
import scrapy
class TestSpider(scrapy.Spider):
name = 'Test'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
quotes = response.xpath('//*[@class="quote"]')
for quote in quotes:
text = quote.xpath('.//*[@class="text"]/text()').extract_first()
author = quote.xpath('.//*[@class="author"]/text()').extract_first()
tags = quote.xpath('.//*[@itemprop="keywords"]/@content').extract_first()
yield{"Text": text, "Author": author, "Tags": tags}
next_p = response.xpath('//*[@class="next"]/a/@href').extract_first()
absolute_n = response.urljoin(next_p)
yield scrapy.Request(absolute_n)
这也是我用来将类字典中定义的数据导出到csv文件的命令(这是通过Windows命令提示符下的scrapy shell运行的)
scrapy crawl Test -o scraped.csv
这就是我如何在csv文件中接收到数据的方法。
请帮助我解决像对待初学者一样对待我的问题。
答案 0 :(得分:1)
如果您将智能引号(例如U,“ U + 201C”)编码为UTF-8,然后尝试将其解码为ISO Latin 9,Windows-1252或其他类似的东西,则mojibake的顺序看起来像是什么类似于Latin-1,但带有欧元符号。例如:
>>> print('\u201c'.encode('utf-8').decode('iso-8859-9')
â
可能有两个地方出了问题。由于您没有在过程的任何步骤或任何代码中向我们显示原始字节,因此无法知道两者中哪一个出错了,但是我可以解释如何处理这两个字节。
首先,您可以将包含这些引号的HTML响应解码为Latin-9或其他格式,即使该响应是用UTF-8编码的。
如果您要明确执行此操作,请停止执行此操作。
但是更有可能的是,例如,您从Scrapy那里获得了TextResponse
并且仅访问resp.text
,并且页面的页眉或meta
标签等错误,导致拖延误解码。
要解决此问题,您想访问原始字节并进行显式解码。因此,如果您使用的是resp.text
,则应该使用resp.body.decode('utf8')
。
或者,您可以将HTML解码,然后将CSV编码,然后将CSV打开为Latin-9而不是UTF-8。在这种情况下,您的代码没有任何更改;您只需要查看电子表格程序的设置即可。
但是,如果您使用的是Windows,则很多Windows软件(尤其是Microsoft的软件)都会做出一些奇怪的假设。默认情况下,假定在OEM代码页中编码了一个文本文件,该文件通常类似于Windows-1252。要覆盖此问题并强制使用UTF-8,您应该包含一个“字节顺序标记”。这实际上不是字节顺序标记(因为这对8位编码没有意义),并且UTF-8的标准强烈建议不要这样做,但是Microsoft还是这样做了。
因此,如果您在Windows上使用Excel,并且不想更改设置,则可以通过使用utf-8-sig
编码而不是utf-8
编写文件来解决Microsoft的问题。 ,这将强制编写“ BOM”:
with open('outfile.csv', 'w', encoding='utf-8-sig') as f:
writer = csv.writer(f)
# etc.
由于您似乎只是通过将-o csv
传递到scrapy crawl
命令来创建导出管道,所以我认为您需要在配置文件中设置FEED_EXPORT_ENCODING
(通过编辑{{ 1}}或使用settings.py
命令),在scrapy settings
命令行(crawl
)或在环境变量(-set FEED_EXPORT_ENDCODING=utf-8-sig
控制台中的SET FEED_EXPORT_ENDCODING=utf-8-sig
cmd
之前的窗口。