Python的html解析器
转自https://blog.csdn.net/jqh2002_blog/article/details/24842217
其实比较不同的解析器对html的处理能力是有点麻烦的,因为它们处理的步骤并不完全相同的:
1. 解析HTML:能读入
2. 解析为某个对象:能处理
3. 序列化:能输出
各个解析器做的可能是三件事中的某部分。基本上常见的解析器调查一下:
lxml: 三样都干,而且还可以使用参数指定其他几种解析器。
BeautifulSoup: 三样都干。
html5lib: 可以解析,但是它的序列化和对象化就做的一般。
ElementTree: 对象化和序列化xml,html支持一般,同时它不具备解析功能,所以通常是用html5lib把文档解析后交给它。
cElementTree: 作为c扩展的一个对象化库。
HTMLParser: 有名的解析库。但不能生成任何结果树。
htmlfill: 这个库实际上使用了HTMLParser,不过在解析的时候把解析后的结果稍微结构化了一下。
Genshi: 三样都干。
xml.dom.minidom: 对象化的库,可以把html5lib的解析结果作为输入。这个是python内置的库,但是,相信本座,不用它为好。
在实际做的时候,本座重点考察了lxml,因为它是基于c的libxml2库的,想必速度会很快。看它官网上的结论,也是很漂亮。不过官网都是自说自话,当然不能全信,因此本座也有做自己的测试。
测试使用的基准文件是Java JDK的Docs(懒得找别的了)。代码就不贴了,反正就是解析。图片是用google的chart api来生成的,大概的代码如下:
def make_chart(data, size_x=400, size_y=None, graph_type='bhs', name_format='%(name)s'):
url = 'http://chart.apis.google.com/chart?'
params = {}
if size_y is None:
size_y = len(data)*30
params['chs'] = '%sx%s' % (size_x, size_y)
numbers = [number for name, number in data]
params['chd'] = 'e:' + ''.join(list(encode_numbers(numbers)))
names = [name_format % dict(name=name, number=number) for name, number in data]
params['chxl'] = '0:|%s|' % '|'.join(reversed(names))
params['chxt'] = 'y'
params['cht'] = graph_type
return url + urllib.urlencode(params)
digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'
其中的encode_numbers主要是用来做输入数据的scale:
def encode_numbers(numbers, lowest=0):
"""
Encodes numbers over the range of 0-4095
"""
if lowest is None:
lowest = min(numbers)
highest = max(numbers)
range = highest-lowest
for number in numbers:
adjusted = int((number - lowest) * 4095 / range)
assert adjusted >= 0 and adjusted <= 4095, 'Out of range: %r' % adjusted
yield digits[adjusted / 64] + digits[adjusted % 64]
解析
可以看到,lxml居然是最快的,比HTMLParser的速度都快(要知道后面这个老兄可是别的什么都不做),原因可能是lxml在内存中生成了一棵树吧。 xml.dom.minidom是慢到龟速了,Genshi算是速度不错的,但是也是所有解析器中最容易出错的。相对而言,html5lib、lxml和BeautifulSoup是最稳定的。尤其是html5lib,可以(从理论上而言)保证解析的鲁棒性。
序列化
虽然lxml又像博尔特一样跑在前面,但是我们可以看到对绝大多数包而言序列化都不算是费时的活。同时,minidom有一次垫底,这下你知道本座为什么叫你不要考虑用它了吧。
结论
由于源于c,实验之前本座也猜想lxml会是更快的那位,但是没有想到它有这么快。后续可能的话,应该再对内存占用率做一个比较。但由于调用的大都是c而不是python来完成运行,相信比较的结果也会比较乐观。因此,本座在后面的博客搬家以及将来一切与xml/html解析相关的工作就交给它了。
这次实验还有一个结论。长期以来,对xml/html的解析,把文件作为一个输入流而不是对象的方式读入一直被认为是最佳方案。拍拍脑袋我们大概可以想象,不断由事件驱动读入token会比在内存中储存整个对象树要。HTMLParser 和Genshi 等解析器都是采用的这种方式。不过通过这次实验我们可以看到,只要我们处理的不是数个G的怪物文件,用持有对象的lxml和ElementTree这样的库其实是更好的选择,因为对对象的处理总是比数据流来得自然很多。即使你真的有非常奇怪的需求,需要处理超大的文件,lxml也有参数可供选择。
转自:http://www.cnblogs.com/wzzkaifa/p/7111431.html
Beautiful Soup解析器比較
·Beautiful Soup支持各种html解析器。包含python自带的标准库。还有其它的很多第三方库模块。
当中一个就是lxml parser,至于lxml parser的安装,能够通过下面方法安装:
1)easy_install lxml 2)pip install lxml
另外。python对于模块的安装,能够查看博客说明。分为两种:easy_install和 pip.
第二种纯python解析器为html5lib解析器。能够像web浏览器那样解析html页面,你能够通过以下两种方式安装html5lib:
1)easy_install html5lib 2)pip install html5lib
以下对各种html解析器的优缺点做一下对照:
| 解析器 | 用法 | 长处 | 缺点 |
|---|---|---|---|
| Python’s html.parser | BeautifulSoup(markup,"html.parser") |
|
不能非常好地兼容(before Python 2.7.3 or 3.2.2) |
| lxml’s HTML parser | BeautifulSoup(markup,"lxml") |
|
External C dependency |
| lxml’s XML parser | BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup,"xml") | 速度非常快
|
External C dependency |
| html5lib | BeautifulSoup(markup, "html5lib") | 1)兼容性非常好 2)能够像web浏览器一样解析html页面 3) Creates valid HTML5 |
|
假设你想追求速度的话。建议使用lxml,假设你使用的python版本号2.x是2.7.3之前的版本号,或者python3.x的是3.2.2之前的版本号。你非常有必要安装使用html5lib或lxml使用。由于python内建的html解析器不能非常好地适应于这些老版本号。
Python的html解析器的更多相关文章
- python 之网页解析器
一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出“ ...
- Windows使用Python统一设置解析器路径
碰到的问题: .py文件放在cgi-bin文件夹下面,这个.py文件都要设置"#!python.exe路径"来告诉CGI如何找解析器解析这个.py的文件,我是想知道这个路径可否统一 ...
- python configparser配置文件解析器
一.Configparser 此模块提供实现基本配置语言的ConfigParser类,该语言提供类似于Microsoft Windows INI文件中的结构.我们经常会在一些软件安装目录下看到.ini ...
- python的lxml解析器
from lxml import etree import codecs import sys from lxml import etree def parser(p): tree = etree.H ...
- Python HTML解析器BeautifulSoup(爬虫解析器)
BeautifulSoup简介 我们知道,Python拥有出色的内置HTML解析器模块——HTMLParser,然而还有一个功能更为强大的HTML或XML解析工具——BeautifulSoup(美味的 ...
- Python之父新发文,将替换现有解析器
花下猫语: Guido van Rossum 是 Python 的创造者,虽然他现在放弃了"终身仁慈独裁者"的职位,但却成为了指导委员会的五位成员之一,其一举一动依然备受瞩目.近日 ...
- python中html解析-Beautiful Soup
1. Beautiful Soup的简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.pyt ...
- Beautiful Soup常见的解析器
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快 ...
- HTML解析器软件
HTML解析器软件 HTML文档解析器 HTMLParser HTML Parser 是一个对HTML进行分析的快速实时的解析器,最新的发行版本是1.6,另外2.0的开发版本已经两年没有进展了.示例代 ...
随机推荐
- 【转】C语言中DEFINE简介及多行宏定义
要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...
- javascript总结41:表格全选反选,经典案例详解
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 在win10 + ie11上使用控件
1.1. 在Win10+IE11上提示创建文件错误的问题 解决方法: 1.打开Internet选项 2.取消勾选启用保护模式 选择"不再显示此消息"
- mybatis insert 自动生成key
<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE& ...
- 结构光和ToF
- Android dex分包方案和热补丁原理
一.分包的原因: 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方 ...
- Mysql的备份,权限与日志
1>Mysql的数据备份 mysqldump 工具 --single-transaction 该选项导出数据之前提交一个BEGIN SQL语句,不会阻塞任何应该程序而且能保证导出数据时的一 ...
- replaceState 实现返回从新定位
在web 开发中,选择列表分类,在中商品, 详情页面后,返回的时候我们想定位到原来选择的分类 就需要借助window.history.replaceState来实现 function getProdu ...
- 学习笔记之Struts2—工作原理图
本文以Struts2的官方工作原理图作为主线讲解(参考部分书籍与视频) 1.初始概念 struts2是web.xml进行配置的一个过滤器,当web项目启动的时候,这个过滤器就会生效. 2.web.xm ...
- WPF成长之路------视频
今天偶然看到一篇博文,发现WPF原来还可以直接播放视频!于是在这里记录一下,以后方便使用: <MediaElement Source="C:\WINDOWS\system32\oobe ...