urllib2 odczyt do Unicode

Muszę przechowywać zawartość strony, która może być w dowolnym języku. I muszę być w stanie przeszukiwać zawartość Dla ciągu Unicode.

Próbowałem czegoś takiego:

import urllib2

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

Zawartość jest strumieniem bajtów, więc mogę wyszukać w nim ciąg znaków Unicode.

Potrzebuję jakiś sposób, że kiedy zrobię urlopen, a następnie odczytam, aby użyć zestawu znaków z nagłówków, aby dekodować zawartość i zakodować ją do UTF-8.

Author: kiamlaluno, 2009-06-20

2 answers

Po wykonanych operacjach zobaczysz:

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

I tak:

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

ucontent jest teraz ciągiem Unicode (140655 znaków) -- tak na przykład, aby wyświetlić jego część, jeśli twoim terminalem jest UTF-8:

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

I możesz szukać, itd, itp.

Edit: Wejście/Wyjście Unicode jest zwykle trudne (może to być to, co trzyma oryginalny asker), ale zamierzam ominąć trudny problem wprowadzania ciągów Unicode do interaktywnego interpretera Pythona (całkowicie niezwiązane z oryginalnym pytaniem), aby pokazać, w jaki sposób, gdy ciąg Unicode jest poprawnie wprowadzony (robię to przez Punkty kodowe -- goofy, ale nie tricky; -), wyszukiwanie jest absolutnie bezmyślne (i tym samym mam nadzieję, że oryginalne pytanie zostało dokładnie odpowiedział). Ponownie zakładając Terminal UTF-8:

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

Uwaga: Należy pamiętać, że ta metoda może nie działać dla wszystkich witryn, ponieważ niektóre witryny określają tylko kodowanie znaków wewnątrz obsługiwanych dokumentów( za pomocą http-equiv meta tags, dla przykład).

 97
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-19 10:47:49

Aby przetworzyć Content-Type nagłówek http, możesz użyć cgi.parse_header funkcji:

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)

Inny sposób na pobranie zestawu znaków:

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

Lub w Pythonie 3:

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

Kodowanie znaków może być również określone wewnątrz dokumentu html, np. <meta charset="utf-8">.

 9
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-22 04:02:19