bearbeiten (2016.10.19):
Mit Scrapy 1.2+ können Sie den FEED_EXPORT_ENCODING
Satz auf das Zeichen verwenden Sie für die Ausgabe JSON-Datei benötigen kodiert, zB FEED_EXPORT_ENCODING = 'utf-8'
(der Standardwert None
sein , was bedeutet, \uXXXX
Flucht)
Hinweis: ich bin Anpassung what I wrote on GitHub for a similar issue ich in der Frage des Kommentare verknüpft.
Beachten Sie, dass eine offene Frage auf Scrapy gibt es die Ausgabe codiert, um einen Parameter zu machen: https://github.com/scrapy/scrapy/issues/1965
Scrapy's default JSON exporter verwendet (Standardeinstellung) ensure_ascii=True
Argument, so dass es Unicode-Zeichen als \uXXXX
Sequenzen ausgibt, bevor die Datei zu schreiben. (Dies ist, was verwendet wird, wenn -o somefile.json
getan wird)
Einstellung ensure_ascii=False
im Exporteur wird Unicode-Zeichenfolgen ausgeben, which will end up as UTF-8 encoded on file. Siehe unten im Abschnitt zum benutzerdefinierten Exportcode.
Zur Veranschaulichung, lassen Sie uns Ihre Eingabe JSON-String zurück in einige Daten lesen zu arbeiten:
>>> import json
>>> test = r'''{"price": "13,000", "name": "\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc"}'''
>>> json.loads(test)
{u'price': u'13,000', u'name': u'\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc'}
Die Eingabe mit \uXXXX
Sequenzen ist gültig JSON für Python (wie es sein sollte) und loads()
erzeugt eine gültige Python dict
.
Nun wollen wir wieder zu JSON serialisiert:
>>> # dumping the dict back to JSON, with default ensure_ascii=True
>>> json.dumps(json.loads(test))
'{"price": "13,000", "name": "\\u58c1\\u6bb4\\u308a\\u4ee3\\u884c\\u69d8\\u5c02\\u7528\\u2605 \\u30c6\\u30ec\\u30d3\\u672c\\u4f53 20v\\u578b \\u767d \\u9001\\u6599\\u8fbc"}'
>>>
Und jetzt mit ensure_ascii=False
>>> # now dumping with ensure_ascii=False, you get a Unicode string
>>> json.dumps(json.loads(test), ensure_ascii=False)
u'{"price": "13,000", "name": "\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc"}'
>>>
Druck Lassen Sie uns den Unterschied zu sehen:
>>> print json.dumps(json.loads(test))
{"price": "13,000", "name": "\u58c1\u6bb4\u308a\u4ee3\u884c\u69d8\u5c02\u7528\u2605 \u30c6\u30ec\u30d3\u672c\u4f53 20v\u578b \u767d \u9001\u6599\u8fbc"}
>>> print json.dumps(json.loads(test), ensure_ascii=False)
{"price": "13,000", "name": "壁殴り代行様専用★ テレビ本体 20v型 白 送料込"}
Wenn Sie JSON Artikel schreiben möchten als UTF-8 können Sie es so machen:
1 .. Definieren Sie einen benutzerdefinierten Artikelexporteur, z. in einer exporters.py
Datei in Ihrem Projekt
$ cat myproject/exporters.py
from scrapy.exporters import JsonItemExporter
class Utf8JsonItemExporter(JsonItemExporter):
def __init__(self, file, **kwargs):
super(Utf8JsonItemExporter, self).__init__(
file, ensure_ascii=False, **kwargs)
2 .. den Standard JSON Artikel Exporteur ersetzt in Ihrem settings.py
FEED_EXPORTERS = {
'json': 'myproject.exporters.Utf8JsonItemExporter',
}
Es gab ein Problem neulich über eben diese: https://github.com/scrapy/scrapy/Ausgaben/1963. Überprüfen Sie, wie Sie einen [Exporteur für benutzerdefinierte Elemente] verwenden können (https://github.com/scrapy/scrapy/issues/1963#issuecomment-215797219) ** ohne ** 'ensure_ascii = True' (der Standard mit scrapy) –
Das Beispiel ist gültig json (fast - es hat ein Komma am Ende) und konnte mit 'json.loads' in Python konvertiert werden. Aber deine Frage ist immer noch sehr verwirrend. Wo ist dieser Json genau? Ist es in eine HTML-Seite eingebettet? Wenn 'name' in dem json ist, wie würde dann auch mit dem '' a/div/h3/text() '' xpath zugegriffen werden? – tdelaney
@tdelaney Der JSON wird ausgegeben, indem die Option "-o" zu "scrapy crawl spider" hinzugefügt wird –