2012-06-05 15 views
5

Ich brauche Hilfe mit einem Schaber ich schreibe. Ich versuche, einen Tisch mit Hochschulrankings zu kratzen, und einige dieser Schulen sind europäische Universitäten mit fremden Namen in ihren Namen (z. B. ä, ü). Ich kratze bereits einen anderen Tisch auf einer anderen Seite mit ausländischen Universitäten auf genau die gleiche Weise, und alles funktioniert gut. Aus irgendeinem Grund funktioniert der aktuelle Scraper jedoch nicht mit fremden Zeichen (und bei der Analyse von fremden Zeichen sind die beiden Scraper genau gleich).Problem mit Scraping-Site mit fremden Zeichen

Hier ist, was ich tue Dinge versuchen & funktioniert:

  1. Declare Codierung auf der ersten Zeile der Datei:

    # -*- coding: utf-8 -*- 
    
  2. importieren & mit Smart Unicode von django Rahmen von django.utils.encoding import smart_unicode

    school_name = smart_unicode(html_elements[2].text_content(), encoding='utf-8',   
    strings_only=False, errors='strict').encode('utf-8') 
    
  3. Verwenden Sie die Verschlüsselungsfunktion, wie oben bei der Verkettung mit der Funktion smart_unicode zu sehen. Ich kann mir nicht vorstellen, was ich sonst falsch machen könnte. Bevor ich mich mit diesen Scraper beschäftigt habe, habe ich wirklich nicht viel über verschiedene Kodierungen verstanden, also war es ein bisschen eine Augenöffner-Erfahrung. Ich habe versucht, die folgenden zu lesen, aber immer noch nicht dieses Problem

Ich verstehe, dass, jedes Zeichen ist eine Zahl zugewiesen, die in Hexadezimal, Binär usw. ausgedrückt werden kann. Verschiedene Codierungen haben unterschiedliche Kapazitäten für wie viele Sprachen sie unterstützen (z. B. ASCII unterstützt nur Englisch, UTF-8 unterstützt alles, was es scheint. Ich habe jedoch das Gefühl, alles Notwendige zu tun, um sicherzustellen, dass die Charaktere korrekt gedruckt werden. Ich weiß nicht, wo mein Fehler ist, und es macht mich verrückt. Bitte helfen Sie !!

+3

FYI, (1) legt nur die Codierung der Python-Quelldatei fest, sodass Sie Nicht-ASCII-Zeichen in den Code einbetten können; es tut nichts wrt. Input-Output. –

+0

Ah ok, das wusste ich nicht. Danke, dass du mich informiert hast. – user642547

+0

'ASCII unterstützt nur Englisch' Nun, nicht ganz. Es gibt andere Sprachen, die von ASCII "unterstützt" werden. – dda

Antwort

2

Beim Extrahieren von Informationen aus einer Webseite müssen Sie die Zeichencodierung bestimmen, ähnlich wie Browser solche Dinge tun (HTTP-Header analysieren, HTML nach Tags durchsuchen und möglicherweise auf den tatsächlichen Daten basieren, z Vorhandensein von etwas, das in einigen Kodierungen wie BOM aussieht. Hoffentlich finden Sie eine Bibliotheksroutine, die das für Sie erledigt.

In jedem Fall sollten Sie nicht erwarten, dass alle Websites utf-8-codiert sind. Iso-8859-1 ist immer noch weit verbreitet, und im Allgemeinen liest man iso-8859-1, als ob es utf-8 wäre, was zu einem großen Durcheinander führt (für irgendwelche Nicht-Ascii-Zeichen).

-1

Sie müssen zuerst am <head> Teil des Dokuments schauen und sehen, ob charset Informationen gibt es:

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

(Beachten Sie, dass Stackoverflow, genau diese Seite, keine charset info ... Ich frage mich, wie 中文字, die ich tippte unter der Annahme, es ist UTF-8 hier, wird auf Chinese PeeCees angezeigt, die höchstwahrscheinlich als GBK oder Japanisch pasokon eingerichtet sind, die immer noch fest in Shift-JIS-Land sind).

Also, wenn Sie einen Zeichensatz haben, wissen Sie, was zu erwarten ist, und damit umgehen. Wenn nicht, müssen Sie ein fundiertes Raten erraten - gibt es Nicht-ASCII-Zeichen (> 127) in der Nur-Text-Version der Seite? Gibt es HTML-Entitäten wie &#19968; (一) oder &#233; (é)?

Sobald Sie die Kodierung der Seite erraten/ermittelt haben, können Sie diese in UTF-8 umwandeln und auf Ihrem Weg sein.

+0

Die Meta-Informationen in HTML haben nichts mit den HTTP-Headern zu tun. – schlamar

+0

Und SO hat eine Charset-Einstellung in der Kopfzeile: 'Content-Type: text/html; charset = utf-8' – schlamar

+0

Ich schaue jetzt auf die HTML-Quelle und es gibt keine Zeichensatzinformationen ... – dda

0

Wenn Sie die requests library verwenden, dekodiert es automatisch den Inhalt basierend auf HTTP-Headern. Das Abrufen des HTML-Inhalts einer Seite ist wirklich einfach:

>>> import requests 
>>> r = requests.get('https://github.com/timeline.json') 
>>> r.text 
'[{"repository":{"open_issues":0,"url":"https://github.com/... 
Verwandte Themen