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的开发版本已经两年没有进展了.示例代 ...
随机推荐
- 斐波那契数列—java实现
最近在面试的时候被问到了斐波那契数列,而且有不同的实现方式,就在这里记录一下. 定义 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
- Java虚拟机学习(1): 类加载机制
转自:微信公共号ImportNew 来源:java2000_wl 链接:blog.csdn.net/java2000_wl/article/details/8040633 JVM把class文件加载的 ...
- gogland golang 颜色&字体 colors&font 配置文件
<scheme name="Ya" version="142" parent_scheme="Darcula"> <opt ...
- CodeForces 342C Cupboard and Balloons (几何问题)
题意:给定一个 r 和 h,r 是上面那个半球的半径,h 是下面那个圆柱的高度,然后有一些半径为 r/2的气球,问你最多能放几个. 析:根据题意,很容易知道,先从下面往上放,两个两个的放,放到不能放的 ...
- Swift & Objc 在同一个项目中的使用
在WWDC大会中发布了Swift让人眼前一亮.终于加了很多的现代编程语言该有的东西.很早年以前玩C#3.0+的时候这些差不多类似的 已经用的烂熟的东西终于一点一点的在看Swift Programmin ...
- HALCON机器视觉软件
HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境.它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉,医学图像和图像分析 ...
- Short jhat tutorial: diagnosing OutOfMemoryError by example
转自: http://petermodzelewski.blogspot.com/2013/06/short-jhat-tutorial-diagnosing.html jhat这个工具经过使用, 发 ...
- 深入理解java虚拟机(八)类加载过程详解
类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(In ...
- 基于ZKEACMS的.Net Core多租户CMS建站系统
多租户架构 多租户技术或称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在多用户环境下共用相同的系统或程序组件,并且可确保各用户间数据的隔离性.简单讲:在一台服务器上运行单个应用实例,它为 ...
- ZKEACMS 配置使用 HTTPS
在开始之前,请升级你的ZKEACMS到最新版本,旧版本使用HTTPS会有问题 https加密链接,在访问的过程中,可以保护你的隐私,保证你的敏感数据不会被别人偷窥,窃取.如果你的服务器在境外,使用ht ...