Python urllib2读取到Unicode

Python urllib2读取到Unicode,python,unicode,urllib2,Python,Unicode,Urllib2,我需要存储一个网站的内容,可以在任何语言。我需要能够搜索Unicode字符串的内容 我试过这样的方法: import urllib2 req = urllib2.urlopen('http://lenta.ru') content = req.read() 内容是一个字节流,因此我可以在其中搜索Unicode字符串 我需要某种方法,当我执行urlopen然后读取时,使用标题中的字符集解码内容并将其编码为UTF-8。执行操作后,您将看到: >>> req.headers['c

我需要存储一个网站的内容,可以在任何语言。我需要能够搜索Unicode字符串的内容

我试过这样的方法:

import urllib2

req = urllib2.urlopen('http://lenta.ru')
content = req.read()
内容是一个字节流,因此我可以在其中搜索Unicode字符串


我需要某种方法,当我执行
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
现在是一个Unicode字符串(140655个字符)——例如,如果您的终端是UTF-8,则显示其中的一部分:

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

注意:请记住,此方法可能不适用于所有站点,因为某些站点仅在提供的文档中指定字符编码(例如,使用http等效元标记)。

要解析
内容类型
http头,可以使用
cgi.parse_头
函数:

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文档中指定,例如,

编码是使用urllib库中的函数而不是urllib2中的函数完成的。在@Macarse中,这不是Vitaly所指的编码,他指的是使用“[byte string]”对实际请求上下文进行解码和编码。解码(“[charset]”)和u“[unicode string]”。编码('utf-8')。您指的是编码请求参数。相关:嘿,Alex,谢谢您的回复。但如果我这样做:u'Гаааааааu'在ucontent中返回False。有更好的搜索方法吗?你是如何输入u'…'字符串的?Unicode I/O很棘手,因为您的终端和Python必须在相同的波长上。使用显式Unicode代码点(枯燥但不棘手)很好,让我编辑我的答案来说明这一点。我正在使用控制台输入,如果我需要在单元测试中这样做,我应该将编码设置为什么:在文件顶部?完全取决于终端/控制台的编码设置方式!请参阅--例如,对于utf-8,在文件开始处使用注释#--编码:utf-8。在响应头上使用
.split
提取
字符集
参数是欺骗。如果分号后面还有另一个参数呢?
>>> import urllib.request
>>> r = urllib.request.urlopen('http://lenta.ru')
>>> r.headers.get_content_charset()
'utf-8'