python抓取网页数据( 2013七月14周日ZoeyYoungPython在使用Python抓取网页并进行分析)
优采云 发布时间: 2022-02-16 12:16python抓取网页数据(
2013七月14周日ZoeyYoungPython在使用Python抓取网页并进行分析)
[常用] Python中检测网页编码
2013 年 7 月 14 日星期日 Zoey Young Python
使用 Python 抓取网页并对其进行分析时出现此错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6
原因是有些中文网站编码不是utf8,所以需要编码判断
问题描述:
引自如何高效、准确、自动识别网页代码
在引入自动编码识别之前,我们有两种方式获取网页的编码信息:
它的一、是通过服务器返回的header中的charset变量获取的
它的二、是通过页面中的元信息获取的
一般情况下,如果服务器或者页面提供了这两个参数,并且参数正确,那么我们在抓取网页时就没有编码问题。
但现实对我们程序员来说总是很困难。在抓取网页时,经常会出现以下几种情况:
缺少这两个参数。虽然提供了这两个参数,但它们是不一致的。提供了这两个参数,但与网页的实际编码不一致。
为了尽可能自动地获取所有网页的编码,引入了自动编码识别。
夏代
搜索chardet立马找到了Python的chardet第三方库
可以通过pip安装
pip install chardet
主页说明:
chardet 猜测文本文件的编码。
检测...
需要 Python 2.1 或更高版本。
我正在使用 Python 2.7.X
网页编码判断:
import chardet
import urllib2
#可根据需要,选择不同的数据
html = urllib2.urlopen('http://www.zol.com.cn/').read()
print(chardet.detect(html))
运行结果:
{'confidence': 0.99, 'encoding': 'GB2312'}
chardet.detect() 返回一个字典,其中confidence为检测准确率,encoding为编码形式
其他方式:
import urllib2
from chardet.universaldetector import UniversalDetector
html = urllib2.urlopen('http://www.zol.com.cn/')
#创建一个检测对象
detector = UniversalDetector()
for line in html.readlines():
#分块进行测试,直到达到阈值
detector.feed(line)
if detector.done: break
#关闭检测对象
detector.close()
html.close()
#输出检测结果
print detector.result
运行结果:
{'confidence': 0.99, 'encoding': 'GB2312'}
如果要识别大文件的编码方式,使用后一种方法,可以只读取一部分来判断编码方式,从而提高检测速度。
BeautifulSoup4 Unicode该死
可以使用 BeautifulSoup4 的模块
from bs4 import UnicodeDammit
dammit = UnicodeDammit("Sacr\xc3\xa9 bleu!")
print(dammit.unicode_markup)
# Sacré bleu!
dammit.original_encoding
# 'utf-8'
总结
无论使用上述哪个模块,都不能保证100%正确... 网站 的一部分太糟糕了...
以下是我最后的写作方式。结合这两种方法,可以检测到前面测试中出现乱码的网站,但是代码看起来不是很干净:
参考文档
python编码检测原理及chardet模块的应用
如何高效、准确、自动地识别网页代码