首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scrapy文本编码

scrapy文本编码
EN

Stack Overflow用户
提问于 2012-02-08 01:51:50
回答 8查看 47K关注 0票数 37

这是我的蜘蛛

代码语言:javascript
复制
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。我不知道哪种方法是最好的。我尝试了几种方法,但都没有结果。

提前谢谢你!

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-02-08 22:23:41

Scrapy返回unicode格式的字符串,而不是ascii格式的字符串。要将所有字符串编码为utf-8,您可以这样写:

代码语言:javascript
复制
vriskoit['eponimia'] = [s.encode('utf-8') for s in hxs.select('//a[@itemprop="name"]/text()').extract()]

但我认为你期待的是另一个结果。您的代码返回一个包含所有搜索结果的项目。要返回每个结果的项,请执行以下操作:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 ITEM_PIPELINES = ['vrisko.pipelines.JsonWithEncodingPipeline']

你可以定制管道来以更易读的格式写入数据,例如,你可以生成一些格式化的报告。JsonWithEncodingPipeline只是一个基本的例子。

票数 37
EN

Stack Overflow用户

发布于 2016-12-27 21:40:20

从Scrapy 1.2.0开始,a new setting FEED_EXPORT_ENCODING is introduced。通过将其指定为utf-8,JSON输出将不会被转义。

也就是要添加到您的settings.py

代码语言:javascript
复制
FEED_EXPORT_ENCODING = 'utf-8'
票数 98
EN

Stack Overflow用户

发布于 2017-07-06 16:02:00

尝试将以下行添加到Scrapy的配置文件中(即settings.py):

代码语言:javascript
复制
FEED_EXPORT_ENCODING = 'utf-8'
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9181214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档