2012-05-24 9 views
5

Update: dieser Fehler kann dies einfach durch Ausführen von der Befehlszeile wiedergegeben werden:Scrapy Spinne: mit Seiten zu tun, die falsch-definierten Zeichencodierung

scrapy shell http://www.indiegogo.com/Straight-Talk-About-Your-Future 

Ich verwende Scrapy zu eine Website crawlen. Jede Seite I Ansprüche kratzen codierte UTF-8 werden:

<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> 

Aber gelegentlich enthalten die Seiten Bytes, die außerhalb von UTF-8 fallen, und ich bekomme Scrapy Fehler wie:

exceptions.UnicodeDecodeError: 'utf8' codec can't decode byte 0xe8 in position 131: invalid continuation byte 

ich noch müssen diese Seiten abkratzen, auch wenn sie nicht mappbare Zeichen enthalten. Gibt es eine Möglichkeit, Scrapy mitzuteilen, dass die deklarierte Codierung der Seite überschrieben werden soll, und stattdessen eine andere (z. B. UTF-16) verwenden soll?

Hier ist, wo die Ausnahme gefangen wird:

2012-05-30 14:43:20+0200 [igg] ERROR: Spider error processing <GET http://www.site.com/page> 
    Traceback (most recent call last): 
     File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 1178, in mainLoop 
     self.runUntilCurrent() 
     File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 800, in runUntilCurrent 
     call.func(*call.args, **call.kw) 
     File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 368, in callback 
     self._startRunCallbacks(result) 
     File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 464, in _startRunCallbacks 
     self._runCallbacks() 
    --- <exception caught here> --- 
     File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 551, in _runCallbacks 
     current.result = callback(current.result, *args, **kw) 
     File "/Library/Python/2.7/site-packages/scrapy/core/spidermw.py", line 61, in process_spider_output 
     result = method(response=response, result=result, spider=spider) 
+0

Je nachdem, wo dies geschieht, können Sie my_string.encode ('utf8') hinzufügen, um diesen Fehler zu umgehen. –

Antwort

4

Es gab einige Arbeiten zur Kodierung im neuesten Entwickler Schrott (0,15). Es könnte sich lohnen, die neueste Version auszuprobieren.

Scrapy ermöglicht den Zugriff auf Unicode über response.body_as_unicode. Dies funktioniert ähnlich wie bei Browsern und Sie sollten fast immer diesen anstelle des rohen Körpers verwenden. Ab scrapy 0,15, es stützt sich auf w3lib.encoding.html_to_unicode, mit ein wenig Anpassung.

Die Decodierung geschieht träge, wenn jemand Unicode anfordert. Sie können eine neue Antwort erstellen, in der Sie die Codierung selbst angeben, die Sie im Spider erhalten, dies sollte jedoch nicht notwendig sein.

Es ist nicht klar aus dem Traceback, welches Bit des Codes tatsächlich den Fehler verursacht. Gab es noch mehr Details? Eine andere Möglichkeit könnte sein, dass der Körper irgendwie abgeschnitten wird.

Wenn diese Seiten von einem Browser und nicht von scrapy korrekt behandelt werden, wäre es hilfreich, wenn Sie einen einfachen Testfall erstellen und einen Fehler melden könnten.

+0

Dank Shane. Dieser Fehler kann leicht aus der Scrapy-Shell reproduziert werden: "scrapy shell http://www.indiegogo.com/Straight-Talk-About-Your-Future" – Misener

+0

funktioniert für mich auf dem neuesten Scrapy, von Scrapy Shell. Die Codierung wird als utf8 erkannt und die body_as_unicode sieht in Ordnung aus. –

+0

In der Tat! Gerade auf 0.15.1 aufgerüstet, und es funktioniert gut. Vielen Dank! – Misener

0

Ich gehe davon aus, dass dies in der Pipeline geschieht und nicht in den Downloader.

Bereinigen Sie die Daten, bevor Sie Ihre Elemente befüllt haben (ersetzen Sie Bytes, die nicht decodiert werden können).

+1

Ich denke, es passiert, wenn 'HtmlXpathSelector (Antwort)' – warvariuc

1

Da Sie verschiedene Zeichencodierungen auf Webseiten erhalten können, ist es am besten, alle Ihre Scraped-Daten so schnell wie möglich in Unicode zu decodieren, sie als Unicode in der Spinne zu bearbeiten und dann in letzter Minute zu codieren du druckst es oder legst es in eine Datenbank usw.) Ich schrieb tatsächlich ein Stück darüber (basierend auf meiner eigenen Erfahrung mit scrapy) vor zwei Tagen, das hilfreich sein kann http://www.harman-clarke.co.uk/answers/python-web-scraping-unicode.php

Verwandte Themen