这是我的spider
from scrapy.contrib.spiders import CrawlSpider,Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import HtmlXPathSelector from vrisko.items import VriskoItem class vriskoSpider(CrawlSpider): name = 'vrisko' allowed_domains = ['vrisko.gr'] start_urls = ['http://www.vrisko.gr/search/%CE%B3%CE%B9%CE%B1%CF%84%CF%81%CE%BF%CF%82/%CE%BA%CE%BF%CF%81%CE%B4%CE%B5%CE%BB%CE%B9%CE%BF'] rules = (Rule(SgmlLinkExtractor(allow=('\?page=\d')),'parse_start_url',follow=True),) def parse_start_url(self, response): hxs = HtmlXPathSelector(response) vriskoit = VriskoItem() vriskoit['eponimia'] = hxs.select("//a[@itemprop='name']/text()").extract() vriskoit['address'] = hxs.select("//div[@class='results_address_class']/text()").extract() return vriskoit
我的问题是返回的字符串是unicode,我想将它们编码为utf-8。我不知道哪种方法是最好的方法。我尝试了几种方法都没有结果。
Scrapy以unicode而不是ascii返回字符串。要将所有字符串编码为utf-8,可以编写:
vriskoit['eponimia'] = [s.encode('utf-8') for s in hxs.select('//a[@itemprop="name"]/text()').extract()]
但我认为你会期待另一个结果。你的代码返回包含所有搜索结果的一项。要为每个结果返回项目:
hxs = HtmlXPathSelector(response) for eponimia, address in zip(hxs.select("//a[@itemprop='name']/text()").extract(), hxs.select("//div[@class='results_address_class']/text()").extract()): vriskoit = VriskoItem() vriskoit['eponimia'] = eponimia.encode('utf-8') vriskoit['address'] = address.encode('utf-8') yield vriskoit
更新资料
JSON导出程序\u03a4默认会编写转义的unicode符号(例如),因为并非所有流都可以处理unicode。它可以选择将它们编写为unicode ensure_ascii=False(请参阅docs.json.dumps)。但是我找不到将这个选项传递给标准Feed导出程序的方法。
\u03a4
unicode ensure_ascii=False
因此,如果希望导出的项目以utf-8编码形式编写,例如在文本编辑器中读取它们,则可以编写自定义项目管道。
utf-8
pipelines.py: import json import codecs class JsonWithEncodingPipeline(object): def __init__(self): self.file = codecs.open('scraped_data_utf8.json', 'w', encoding='utf-8') def process_item(self, item, spider): line = json.dumps(dict(item), ensure_ascii=False) + "\n" self.file.write(line) return item def spider_closed(self, spider): self.file.close()
不要忘记将此管道添加到·:
ITEM_PIPELINES = ['vrisko.pipelines.JsonWithEncodingPipeline']
你可以自定义管道,以更易读的格式写入数据,例如,可以生成某些格式的报告。·只是基本示例。
从Scrapy 1.2.0开始,引入了新的设置FEED_EXPORT_ENCODING。通过将其指定为·,将不会转义JSON输出。
那就是添加你的·:
FEED_EXPORT_ENCODING = 'utf-8'