urllib2读取为Unicode

Vit*_*biy 46 python unicode urllib2

我需要存储可以使用任何语言的网站内容.我需要能够在内容中搜索Unicode字符串.

我尝试过类似的东西:

import urllib2

req = urllib2.urlopen('http://lenta.ru')
content = req.read()
Run Code Online (Sandbox Code Playgroud)

内容是一个字节流,所以我可以在其中搜索Unicode字符串.

我需要一些方法,当我这样做urlopen,然后阅读使用标题中的charset解码内容并将其编码为UTF-8.

Ale*_*lli 99

在您执行的操作之后,您将看到:

>>> req.headers['content-type']
'text/html; charset=windows-1251'
Run Code Online (Sandbox Code Playgroud)

所以:

>>> encoding=req.headers['content-type'].split('charset=')[-1]
>>> ucontent = unicode(content, encoding)
Run Code Online (Sandbox Code Playgroud)

ucontent 现在是一个Unicode字符串(140655个字符) - 例如,如果您的终端是UTF-8,则显示其中的一部分:

>>> print ucontent[76:110].encode('utf-8')
<title>Lenta.ru: ???????: </title>
Run Code Online (Sandbox Code Playgroud)

你可以搜索等等

编辑: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
Run Code Online (Sandbox Code Playgroud)

注意:请记住,此方法可能不适用于所有站点,因为某些站点仅在服务文档中指定字符编码(例如,使用http-equiv元标记).

  • 完全取决于终端/控制台编码的设置方式!请参阅http://www.python.org/dev/peps/pep-0263/ - 例如,对于utf-8,请在文件开头使用注释# - * - coding:utf-8 - * - . (3认同)
  • 你是如何输入那个'...'字符串的?Unicode I/O很棘手,因为你的终端和Python必须在相同的波长上.使用显式的Unicode代码点(无聊但不棘手)工作正常,让我编辑我的答案来表明. (2认同)

jfs*_*jfs 10

要解析Content-Typehttp标头,您可以使用以下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)
Run Code Online (Sandbox Code Playgroud)

另一种获取字符集的方法:

>>> import urllib2
>>> r = urllib2.urlopen('http://lenta.ru')
>>> r.headers.getparam('charset')
'utf-8'
Run Code Online (Sandbox Code Playgroud)

或者在Python 3中:

>>> import urllib.request
>>> r = urllib.request.urlopen('http://lenta.ru')
>>> r.headers.get_content_charset()
'utf-8'
Run Code Online (Sandbox Code Playgroud)

字符编码也可以在html文档中指定,例如,<meta charset="utf-8">.