这是我的蜘蛛
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。我不知道哪种方法是最好的。我尝试了几种方法,但都没有结果。
提前谢谢你!
发布于 2012-02-08 22:23:41
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导出器写入unicode转义的符号(例如\u03a4),因为并不是所有的流都可以处理unicode。它可以选择将它们写成unicode ensure_ascii=False (参见json.dumps的文档)。但我找不到方法将此选项传递给标准提要导出器。
因此,如果您希望导出的项目以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()不要忘记将此管道添加到settings.py:
ITEM_PIPELINES = ['vrisko.pipelines.JsonWithEncodingPipeline']你可以定制管道来以更易读的格式写入数据,例如,你可以生成一些格式化的报告。JsonWithEncodingPipeline只是一个基本的例子。
发布于 2016-12-27 21:40:20
从Scrapy 1.2.0开始,a new setting FEED_EXPORT_ENCODING is introduced。通过将其指定为utf-8,JSON输出将不会被转义。
也就是要添加到您的settings.py中
FEED_EXPORT_ENCODING = 'utf-8'发布于 2017-07-06 16:02:00
尝试将以下行添加到Scrapy的配置文件中(即settings.py):
FEED_EXPORT_ENCODING = 'utf-8'https://stackoverflow.com/questions/9181214
复制相似问题