urllib2 lesen zu Unicode
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.
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">
.