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">