Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Scrapy获得UTF-8编码的unicode输出?_Scrapy - Fatal编程技术网

如何从Scrapy获得UTF-8编码的unicode输出?

如何从Scrapy获得UTF-8编码的unicode输出?,scrapy,Scrapy,请容忍我。我正在写每一个细节,因为工具链的很多部分都不能很好地处理Unicode,而且不清楚什么地方出了问题 前奏曲 我们首先设置并使用了最近的刮痧 source ~/.scrapy_1.1.2/bin/activate 由于终端的默认值是ascii,而不是unicode,因此我们设置: export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 另外,由于默认情况下Python使用ascii,我们修改了编码: export PYTHONIOENCOD

请容忍我。我正在写每一个细节,因为工具链的很多部分都不能很好地处理Unicode,而且不清楚什么地方出了问题

前奏曲

我们首先设置并使用了最近的刮痧

source ~/.scrapy_1.1.2/bin/activate
由于终端的默认值是ascii,而不是unicode,因此我们设置:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
另外,由于默认情况下Python使用ascii,我们修改了编码:

export PYTHONIOENCODING="utf_8"
现在我们准备开始一个艰难的项目

scrapy startproject myproject
cd myproject
scrapy genspider dorf PLACEHOLDER
有人告诉我们现在有一只蜘蛛

Created spider 'dorf' using template 'basic' in module:
  myproject.spiders.dorf
我们将
myproject/items.py
修改为:

# -*- coding: utf-8 -*-
import scrapy

class MyprojectItem(scrapy.Item):
    title = scrapy.Field()
尝试1

现在我们根据
urllib.unquote

# -*- coding: utf-8 -*-
import scrapy
import urllib
from myproject.items import MyprojectItem

class DorfSpider(scrapy.Spider):
    name = "dorf"
    allowed_domains = [u'http://en.sistercity.info/']
    start_urls = (
        u'http://en.sistercity.info/sister-cities/Düsseldorf.html',
    )

    def parse(self, response):
        item = MyprojectItem()
        item['title'] = urllib.unquote(
            response.xpath('//title').extract_first().encode('ascii')
        ).decode('utf8')
        return item
最后我们使用了一个(从2011年10月开始)

FEED_EXPORTERS = {
    'json': 'myproject.exporters.UnicodeJsonLinesItemExporter',
}
myproject/settings.py

现在我们跑

~/myproject> scrapy crawl dorf -o dorf.json -t json
我们得到

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 25: ordinal not in range(128)
尝试2

另一个解决方案(Scrapy 1.2的候选解决方案?)是使用spider

# -*- coding: utf-8 -*-
import scrapy
from myproject.items import MyprojectItem

class DorfSpider(scrapy.Spider):
    name = "dorf"
    allowed_domains = [u'http://en.sistercity.info/']
    start_urls = (
        u'http://en.sistercity.info/sister-cities/Düsseldorf.html',
    )

    def parse(self, response):
        item = MyprojectItem()
        item['title'] = response.xpath('//title')[0].extract()
        return item

myproject/settings.py

我们得到以下JSON文件

[
{"title": "<title>Sister cities of D\u00fcsseldorf \u2014 sistercity.info</title>"}
]
[
{“title”:“D\u00fcsseldorf\u2014 sistercity.info的姐妹城市”}
]
Unicode不是UTF-8编码的。虽然这对于几个字符来说是一个微不足道的问题,但是如果整个输出都是用外语的话,这将成为一个严重的问题


如何获得UTF-8 unicode格式的输出?

请在您的尝试1上尝试此功能,并告诉我它是否有效(我在没有设置所有环境变量的情况下对其进行了测试)

范围(2)
用于测试json导出器,要获得DICT列表,您可以这样做:

# -*- coding: utf-8 -*-
from scrapy.contrib.exporter import JsonItemExporter
from scrapy.utils.serialize import ScrapyJSONEncoder

class UnicodeJsonLinesItemExporter(JsonItemExporter):
    def __init__(self, file, **kwargs):
        self._configure(kwargs, dont_fail=True)
        self.file = file
        self.encoder = ScrapyJSONEncoder(ensure_ascii=False, **kwargs)
        self.first_item = True

在Scrapy 1.2+中有一个选项。当关闭JSON输出中非ascii符号的转义时。

如何在scrapy Spider中添加提要导出编码将其放入settings.py文件
FEED_EXPORTERS = {
    'json': 'myproject.exporters.Utf8JsonItemExporter',
}
[
{"title": "<title>Sister cities of D\u00fcsseldorf \u2014 sistercity.info</title>"}
]
def to_write(uni_str):
    return urllib.unquote(uni_str.encode('utf8')).decode('utf8')


class CitiesSpider(scrapy.Spider):
    name = "cities"
    allowed_domains = ["sitercity.info"]
    start_urls = (
        'http://en.sistercity.info/sister-cities/Düsseldorf.html',
    )

    def parse(self, response):
        for i in range(2):
            item = SimpleItem()
            item['title'] = to_write(response.xpath('//title').extract_first())
            item['url'] = to_write(response.url)
            yield item
# -*- coding: utf-8 -*-
from scrapy.contrib.exporter import JsonItemExporter
from scrapy.utils.serialize import ScrapyJSONEncoder

class UnicodeJsonLinesItemExporter(JsonItemExporter):
    def __init__(self, file, **kwargs):
        self._configure(kwargs, dont_fail=True)
        self.file = file
        self.encoder = ScrapyJSONEncoder(ensure_ascii=False, **kwargs)
        self.first_item = True