我需要存储可以使用任何语言的网站内容。我需要能够在内容中搜索Unicode字符串。
我尝试过类似的事情:
import urllib2
req = urllib2.urlopen('http://lenta.ru')
content = req.read()
内容是字节流,因此我可以在其中搜索Unicode字符串。
当我执行urlopen
然后读取使用标题中的字符集来解码内容并将其编码为UTF-8时,我需要一些方法。
答案 0 :(得分:98)
在您执行的操作之后,您将看到:
>>> 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>
你可以搜索等等。
编辑:Unicode I / O通常很棘手(这可能会阻碍原始提问者)但是我将绕过将Unicode字符串输入到交互式Python解释器的难题(与原始问题完全无关)为了说明,一旦Unicode字符串被正确输入(我是通过代码点来做 - 傻傻但不狡猾;-),搜索绝对是一个明智的选择(因此希望原始问题得到彻底解决)。再假设一个UTF-8终端:
>>> x=u'\u0413\u043b\u0430\u0432\u043d\u043e\u0435'
>>> print x.encode('utf-8')
Главное
>>> x in ucontent
True
>>> ucontent.find(x)
93
注意:请注意,此方法可能不适用于所有网站,因为某些网站仅在提供的文档中指定字符编码(例如,使用http-equiv元标记)。
答案 1 :(得分:9)
要解析Content-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">
。