2017-05-03 9 views
1

Ich kratze this link mit Python Scrapy. Alle Dateien haben # -*- coding: utf-8 -*- am AnfangPython Scrapy gibt keine chinesischen Zeichen zurück

Und um Titel des Produktes zu extrahieren, habe ich diesen Code.

response.css("h1.d-title::text").extract_first()

Dies zeigt

2017\xe6\x98\xa5\xe5\xa4\x8f\xe6\x96\xb0\xe6\xac\xbe\xe5\xa5\xb3\xe5\xa3\xab\xe8\xbf\x90\xe5\x8a\xa8\xe9\x9e\x8b\xe9\x9f\xa9\xe7\x89\x88\xe4\xbc\x91\xe9\x97\xb2\xe7\xbd\x91\xe5\x8d\x95\xe9\x9e\x8bsport shoes men\xe5\xa4\x96\xe8\xb4\xb8\xe6\x89\xb9\xe5\x8f\x91 

Und wenn ich

response.css("h1.d-title::text").extract_first().decode('gbk').encode('utf-8')

Its me

UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-19: ordinal not in range(128)

Fehler geben

Ich habe andere Alternatvies online versucht, aber nichts davon hat funktioniert.

Obwohl, wenn ich dies in Python Terminal (ohne Scrapy) tun, druckt es perfekt chinesisch !.

>>> s = "2017\xe6\x98\xa5\xe5\xa4\x8f\xe6\x96\xb0\xe6\xac\xbe\xe5\xa5\xb3\xe5\xa3\xab\xe8\xbf\x90\xe5\x8a\xa8\xe9\x9e\x8b\xe9\x9f\xa9\xe7\x89\x88\xe4\xbc\x91\xe9\x97\xb2\xe7\xbd\x91\xe5\x8d\x95\xe9\x9e\x8bsport shoes men\xe5\xa4\x96\xe8\xb4\xb8\xe6\x89\xb9\xe5\x8f\x91" 
>>> print s 
2017春夏新款女士运动鞋韩版休闲网单鞋sport shoes men外贸批发 

Warum gibt es korrekte Ausgabe mit print?

Antwort

0

Basierend auf dem Beispiel-Code mit print s Ich nehme an, Sie verwenden Python 2.7

Als ich

response.css("h1.d-title::text").extract_first() 

auf der Website Sie lief ich dies als Folge bekam aufgeführt:

u'2017\u6625\u590f\u65b0\u6b3e\u5973\u58eb\u8fd0\u52a8\u978b\u97e9\u7248\u4f11\u95f2\u7f51\u5355\u978bsport shoes men\u5916\u8d38\u6279\u53d1' 

Means scrapy konvertiert das Ergebnis bereits in ein Unicode-Objekt (das hätte ich erwartet).

Dann läuft decode('gbk') auf es wird fehlschlagen, wie Decodierung versucht, es als eine gbk-codierte Zeichenfolge zu interpretieren.

Wenn Sie also Sie es utf-8 konvertieren müssen (statt nur die Unicode-Objekt, das ich würde es vorziehen) sollten Sie dies tun:

response.css("h1.d-title::text").extract_first().encode('utf-8') 

Ergebnis:

'2017\xe6\x98\xa5\xe5\xa4\x8f\xe6\x96\xb0\xe6\xac\xbe\xe5\xa5\xb3\xe5\xa3\xab\xe8\xbf\x90\xe5\x8a\xa8\xe9\x9e\x8b\xe9\x9f\xa9\xe7\x89\x88\xe4\xbc\x91\xe9\x97\xb2\xe7\xbd\x91\xe5\x8d\x95\xe9\x9e\x8bsport shoes men\xe5\xa4\x96\xe8\xb4\xb8\xe6\x89\xb9\xe5\x8f\x91' 

Das gibt die gleiche Zeichenfolge aus, die Sie erwarten.

Abgesehen davon ist es normalerweise eine gute Idee, Python3 zu verwenden, da es die meisten dieser Situationen sofort verarbeitet.

1

Scrapy Selector gibt eine Liste von Unicode-Strings zurück, siehe Using selectors with regular expressions. Was Sie tun müssen, ist, den Unicode zu UTF-8 zu kodieren, keine Notwendigkeit, zu gbk zu entschlüsseln und dann wieder zu utf-8 zu kodieren.

title = response.css("h1.d-title::text").extract_first().encode('utf-8') 

Für Druck in Python Terminal, ich denke, die Standard-Kodierung Ihrer Umgebung UTF-8 ist, können Sie Ihre Python-Terminal eingeben:

>>> import sys 
>>> print sys.stdout.encoding 
UTF-8 

, wenn Sie die Unicode-Strings zu drucken, wird es konvertieren zu utf-8 dann ausdrucken.

Verwandte Themen