Python urllib2读取到Unicode
我需要存储一个网站的内容,可以在任何语言。我需要能够搜索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
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'