scrapy文本编码

min*_*ast 30 scrapy

这是我的蜘蛛

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
Run Code Online (Sandbox Code Playgroud)

我的问题是返回的字符串是unicode,我想将它们编码为utf-8.我不知道哪种方法最好.我尝试了几种没有结果的方法.

先感谢您!

Lac*_*cek 63

自Scrapy 1.2.0起,引入了新的设置FEED_EXPORT_ENCODING.通过将其指定为utf-8,JSON输出将不会被转义.

那是添加到你的settings.py:

FEED_EXPORT_ENCODING = 'utf-8'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!非常有用且易于更改。 (2认同)

rec*_*dev 36

Scrapy以unicode返回字符串,而不是ascii.要将所有字符串编码为utf-8,您可以编写:

vriskoit['eponimia'] = [s.encode('utf-8') for s in hxs.select('//a[@itemprop="name"]/text()').extract()]
Run Code Online (Sandbox Code Playgroud)

但我认为你期待另一个结果.您的代码返回一个与所有搜索结果项.要返回每个结果的项目:

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
Run Code Online (Sandbox Code Playgroud)

更新

JSON导出器\u03a4默认写入转义的unicode符号(例如),因为并非所有流都可以处理unicode.它可以选择将它们编写为unicode ensure_ascii=False(请参阅json.dumps的文档).但我找不到将此选项传递给标准Feed导出器的方法.

因此,如果您希望导出的项目以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()
Run Code Online (Sandbox Code Playgroud)

不要忘记将此管道添加到settings.py:

 ITEM_PIPELINES = ['vrisko.pipelines.JsonWithEncodingPipeline']
Run Code Online (Sandbox Code Playgroud)

您可以自定义管道以更人性化的格式写入数据,例如,您可以生成一些格式化报告.JsonWithEncodingPipeline只是基本的例子.


小智 10

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

FEED_EXPORT_ENCODING = 'utf-8'
Run Code Online (Sandbox Code Playgroud)