urllib2读取到Unicode
我需要存储可以使用任何语言的网站的内容。 我需要能够search内容的Unicodestring。
我曾尝试过这样的事情:
import urllib2 req = urllib2.urlopen('http://lenta.ru') content = req.read()
内容是一个字节stream,所以我可以search它的Unicodestring。
我需要一些方法,当我urlopen
,然后阅读使用从标题的字符集解码的内容,并将其编码为UTF-8。
您执行的操作之后,您会看到:
>>> req.headers['content-type'] 'text/html; charset=windows-1251'
所以:
>>> encoding=req.headers['content-type'].split('charset=')[-1] >>> ucontent = unicode(content, encoding)
ucontent
现在是一个Unicodestring( ucontent
字符) – 例如,如果您的terminal是UTF-8,则显示它的一部分:
>>> print ucontent[76:110].encode('utf-8') <title>Lenta.ru: Главное: </title>
你可以search等等
编辑:Unicode I / O通常是棘手的(这可能是什么阻止了原来的提问者),但我要绕过inputUnicodestring交互式Python解释器(完全不相关的原始问题)的难题,以显示如何,一旦一个Unicodestring被正确input(我是通过代码点来做的 – 愚蠢,但不棘手;-),search绝对是一个毫不费力的(因此希望最初的问题已被彻底解答)。 再假设一个UTF-8terminal:
>>> x=u'\u0413\u043b\u0430\u0432\u043d\u043e\u0435' >>> print x.encode('utf-8') Главное >>> x in ucontent True >>> ucontent.find(x) 93
注意 :请记住,这种方法可能不适用于所有的网站,因为有些网站只在所服务的文档中指定字符编码(例如使用http-equiv meta标签)。
要parsingContent-Type
http头,你可以使用cgi.parse_header
函数:
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)
另一种获取字符集的方法:
>>> import urllib2 >>> r = urllib2.urlopen('http://lenta.ru') >>> r.headers.getparam('charset') 'utf-8'
或者在Python 3中:
>>> import urllib.request >>> r = urllib.request.urlopen('http://lenta.ru') >>> r.headers.get_content_charset() 'utf-8'
字符编码也可以在html文档中指定,例如<meta charset="utf-8">
。