Tar*_*mán 34 python screen-scraping urllib urllib2 character-encoding
当使用python对网页进行屏幕抓取时,必须知道页面的字符编码.如果你得到的字符编码错误,你的输出就会搞砸了.
人们通常使用一些基本技术来检测编码.它们使用标题中的字符集或元标记中定义的字符集,或者使用编码检测器(不关心元标记或标题).通过仅使用这些技术,有时您将无法获得与浏览器相同的结果.
浏览器这样做:
(嗯......至少这是我认为大多数浏览器都这样做的方式.文档非常缺乏.)
我正在寻找的是一个可以像浏览器一样决定页面字符集的库.我确信我不是第一个需要妥善解决这个问题的人.
美丽的汤按优先级顺序尝试以下编码,将您的文档转换为Unicode:
Mar*_*wis 37
当您使用urllib或urllib2下载文件时,您可以找出是否传输了字符集标头:
fp = urllib2.urlopen(request)
charset = fp.headers.getparam('charset')
Run Code Online (Sandbox Code Playgroud)
您可以使用BeautifulSoup在HTML中查找元素:
soup = BeatifulSoup.BeautifulSoup(data)
meta = soup.findAll('meta', {'http-equiv':lambda v:v.lower()=='content-type'})
Run Code Online (Sandbox Code Playgroud)
如果两者都不可用,浏览器通常会回退到用户配置,并结合自动检测.正如rajax建议的那样,你可以使用chardet模块.如果您有可用的用户配置,告诉您该页面应该是中文(例如),您可以做得更好.
raj*_*jax 14
使用通用编码检测器:
>>> import chardet
>>> chardet.detect(urlread("http://google.cn/"))
{'encoding': 'GB2312', 'confidence': 0.99}
Run Code Online (Sandbox Code Playgroud)
另一个选择就是使用wget:
import os
h = os.popen('wget -q -O foo1.txt http://foo.html')
h.close()
s = open('foo1.txt').read()
Run Code Online (Sandbox Code Playgroud)
我会为此使用html5lib 。
| 归档时间: |
|
| 查看次数: |
14285 次 |
| 最近记录: |