urllib2 read to Unicode
我需要存储可以使用任何语言的网站内容。 我需要能够在内容中搜索Unicode字符串。
我尝试过类似的东西:
1 2 3 4 | import urllib2 req = urllib2.urlopen('http://lenta.ru') content = req.read() |
内容是一个字节流,所以我可以在其中搜索Unicode字符串。
我需要一些方法,当我做
在您执行的操作之后,您将看到:
1 2 | >>> req.headers['content-type'] 'text/html; charset=windows-1251' |
所以:
1 2 | >>> encoding=req.headers['content-type'].split('charset=')[-1] >>> ucontent = unicode(content, encoding) |
1 2 | >>> print ucontent[76:110].encode('utf-8') Lenta.ru: Главное: |
你可以搜索等等
编辑:Unicode I / O通常很棘手(这可能是阻止原始提问者)但是我将绕过将Unicode字符串输入到交互式Python解释器(与原始问题完全无关)的难题,以显示如何,一旦正确输入了一个Unicode字符串(我是通过代码点来做的 - 傻瓜但不狡猾;-),搜索绝对是一个明智的选择(因此希望原始问题得到彻底解答)。再假设一个UTF-8终端:
1 2 3 4 5 6 7 | >>> 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 2 3 4 5 6 7 | 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) |
另一种获取字符集的方法:
1 2 3 4 | >>> import urllib2 >>> r = urllib2.urlopen('http://lenta.ru') >>> r.headers.getparam('charset') 'utf-8' |
或者在Python 3中:
1 2 3 4 | >>> import urllib.request >>> r = urllib.request.urlopen('http://lenta.ru') >>> r.headers.get_content_charset() 'utf-8' |
字符编码也可以在html文档中指定,例如