python抓取网页数据( 2013七月14周日ZoeyYoungPython在使用Python抓取网页并进行分析)

优采云 发布时间: 2022-02-16 12:16

  python抓取网页数据(

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模块的应用

  如何高效、准确、自动地识别网页代码

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线