Frage

Ich brauche den Inhalt einer Website zu speichern, die in jeder Sprache sein können. Und ich muss in der Lage sein, den Inhalt für eine Unicode-Zeichenfolge zu suchen.

Ich habe versucht, so etwas wie:

import urllib2

req = urllib2.urlopen('http://lenta.ru')
content = req.read()

Der Inhalt ist ein Byte-Strom, also kann ich es für eine Unicode-Zeichenfolge suchen.

Ich brauche eine Möglichkeit, dass, wenn ich urlopen tun und dann den Zeichensatz aus den Header zu verwenden, lesen Sie den Inhalt zu entschlüsseln und verschlüsseln sie in UTF-8.

War es hilfreich?

Lösung

Nach den Operationen, die Sie durchgeführt, Sie werden sehen:

>>> req.headers['content-type']
'text/html; charset=windows-1251'

und so:

>>> encoding=req.headers['content-type'].split('charset=')[-1]
>>> ucontent = unicode(content, encoding)

ucontent ist nun eine Unicode-Zeichenfolge (von 140.655 Zeichen) - so zum Beispiel einen Teil davon angezeigt werden, wenn Ihr Terminal ist UTF-8:

>>> print ucontent[76:110].encode('utf-8')
<title>Lenta.ru: Главное: </title>

und Sie können suchen, etc, etc.

Edit: Unicode-I / O ist in der Regel heikel (dies kann das sein, was die ursprünglichen Fragesteller hält up), aber ich werde das schwierige Problem der Eingabe von Unicode-Strings zu einem interaktiven Python-Interpreter (völlig unabhängig von der ursprünglichen Frage) umgehen zu zeigen, wie, wenn ein String Unicode korrekt Eingang (ich bin es von Codepoints tun - doof, aber nicht heikel ;-), ist die Suche absolut ein Kinderspiel (und damit hoffentlich die ursprüngliche Frage gründlich beantwortet wurde). Wieder einen UTF-8-Terminal unter der Annahme:

>>> x=u'\u0413\u043b\u0430\u0432\u043d\u043e\u0435'
>>> print x.encode('utf-8')
Главное
>>> x in ucontent
True
>>> ucontent.find(x)
93

Hinweis : Bitte beachten Sie, dass diese Methode nicht für alle Standorte arbeiten kann, da nur einige Websites Zeichenkodierung innerhalb der diente Dokumente (mit http-equiv Meta-Tags, zum Beispiel) angeben.

Andere Tipps

Content-Type HTTP-Header zu analysieren, können Sie cgi.parse_header Funktion:

import cgi
import urllib2

r = urllib2.urlopen('http://lenta.ru')
_, params = cgi.parse_header(r.headers.get('Content-Type', ''))
encoding = params.get('charset', 'utf-8')
unicode_text = r.read().decode(encoding)

Eine andere Möglichkeit, den Zeichensatz zu erhalten:

>>> import urllib2
>>> r = urllib2.urlopen('http://lenta.ru')
>>> r.headers.getparam('charset')
'utf-8'

oder in Python 3:

>>> import urllib.request
>>> r = urllib.request.urlopen('http://lenta.ru')
>>> r.headers.get_content_charset()
'utf-8'

Zeichenkodierung kann auch innerhalb HTML-Dokuments zum Beispiel festgelegt werden, <meta charset="utf-8">.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top