转:Python网页解析:BeautifulSoup vs lxml.html

转自:http://www.cnblogs.com/rzhang/archive/2011/12/29/python-html-parsing.html

Python里常用的网页解析库有BeautifulSoup和lxml.html,其中前者可能更知名一点吧,熊猫开始也是使用的BeautifulSoup,但是发现它实在有几个问题绕不过去,因此最后采用的还是lxml: 

1. BeautifulSoup太慢。熊猫原来写的程序是需要提取不定网页里的正文,因此需要对网页进行很多DOM解析工作,经过测试可以认定BS平均比lxml要慢10倍左右。原因应该是libxml2+libxslt的原生C代码比python还是要更快吧 

2. BS依赖python自带的sgmllib,但是这个sgmllib至少有两个问题。首先,它解析“class=我的CSS类”这样的字符串会有问题,参考下面的代码就知道了。

?


1

2

3

from BeautifulSoup import BeautifulSoup

html = u‘<div class=我的CSS类>hello</div>‘

print BeautifulSoup(html).find(‘div‘)[‘class‘]

打印出来的结果是长度为零的字符串,而不是“我的CSS类”。 

不过这个问题可以通过外围代码来解决,只要改写一下sgmllib的attrfind这个查找元素属性的正则就行,可以改成

?


1

sgmllib.attrfind = re.compile(r‘\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*(\‘[^\‘]*\‘|"[^"]*"|[^\s^\‘^\"^>]*))?‘)

这个问题可以说是网页书写不规范造成的,也不能怨sgmllib吧,但是这和BS原来希望能解析格式不好的HTML的宗旨是相违背的。 

但是第二个问题就比较要命了,参看下面的示例代码。

?


1

2

3

from BeautifulSoup import BeautifulSoup

html = u‘<a onclick="if(x>10) alert(x);" href="javascript:void(0)">hello</a>‘

print BeautifulSoup(html).find(‘a‘).attrs

打印出来的结果是:

?


1

[(u‘onclick‘, u‘if(x>10) alert(x);‘)]

显然其中的href属性被抛弃了,原因就是sgmllib库在解析属性的时候一旦遇到了>等特殊符号就会结束属性的解析,要解决这个问题,只能修改sgmllib中SGMLParser的parse_starttag代码,找到292行,即k = match.end(0)这一行,添加下面的代码即可: 

?


1

2

3

4

if k > j:

    match = endbracket.search(rawdata, k+1)

    if not match: return -1

    j = match.start(0)

因此对比起来lxml会好很多,也许在解析某些HTML的时候真的会出问题,但是就现在使用的情况来说还是挺好的。而且lxml的xpath感觉真的很棒,几年前在折腾ASP.NET/Web Service的时候学习过XPath/XSLT之类的东西,但是实用其实挺少的,这次用lxml的xpath,能速度搞定一大堆较繁琐的元素查找,简直太爽了。例如要查找所有有name属性和content属性的meta元素:

?


1

dom.xpath(‘.//meta[@name][@content]‘)

下面是判断元素x是否是元素y的祖节点的代码:

?


1

x in y.xpath(‘ancestor-or-self::*‘)

此外,lxml里还支持string-length、count等XPath 1.0的函数(参见XPath and XSLT with lxml)。不过2.0的函数,如序列操作的函数就不行了,这需要底层libxml2和libxslt库的升级才行。 

当然,lxml也有它自己的问题,那就是多线程方面貌似有重入性问题,如果需要解析大量网页,那只能启动多个进程来试试了。

时间: 2024-08-09 21:59:22

转:Python网页解析:BeautifulSoup vs lxml.html的相关文章

Python网页解析

续上篇文章,网页抓取到手之后就是解析网页了. 在Python中解析网页的库不少,我最开始使用的是BeautifulSoup,貌似这个也是Python中最知名的HTML解析库.它主要的特点就是容错性很好,能很好地处理实际生活中各种乱七八糟的网页,而且它的API也相当灵活而且丰富. 但是我在自己的正文提取项目中,逐渐无法忍受BeautifulSoup了,主要是因为下面几个原因: 由于BeautifulSoup 3(当前的版本)依赖于Python内建的sgmllib.py,而sgmllib.py有好些

网页解析器

1.网页解析器:从网页中提取有价值的数据. 2.python网页解析的方式: 正则表达式.html.parser(python自带).Beautiful Soup(第三方).lxml(python自带). Beautiful Soup可以使用html.parser或者lxml作为解析器 3.网页解析器就是结构化解析-DOM(Document Object Model)树 4.安装Beautiful Soup以及官网地址 pip install beautifulsoup4 http://www.

关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup

读者可能会奇怪我标题怎么理成这个鬼样子,主要是单单写 lxml 与 bs4 这两个 py 模块名可能并不能一下引起大众的注意,一般讲到网页解析技术,提到的关键词更多的是 BeautifulSoup 和 xpath ,而它们各自所在的模块(python 中是叫做模块,但其他平台下更多地是称作库),很少被拿到明面上来谈论.下面我将从效率.复杂度等多个角度来对比 xpath 与 beautifulsoup 的区别. 效率 从效率上来讲,xpath 确实比 BeautifulSoup 高效得多,每次分步

python爬虫之html解析Beautifulsoup和Xpath

Beautiifulsoup Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器.Python标准库中的HTML解析器,也支持 lxml 的 XML解析器.Beautiful Soup 3 目前已经停止开发,推荐现在的项目使用Beautiful Soup 4.Beautiifulsoup:python语言写的re:C语言写的lxml:C语言

Python爬虫解析网页的4种方式 值得收藏

用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. ? 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中,这个时候它的内容其实是一堆HTML,然后再对这些HTML内容进行解析,按照自己的想法提取出想要的数据,所以今天我们主要来讲四种在Python中解析网页HTML内容的方法,各有千秋,适合在不同的场合下使用. 首先我们随意找到一个网址,这时我脑子里闪过了豆瓣这个网站.嗯,毕竟是用Python构建的网

Python下利用BeautifulSoup解析HTML

摘要 Beautiful Soup 是一个可以从 HTML 或 XML 格式文件中提取数据的 Python 库,他可以将HTML 或 XML 数据解析为Python 对象,以方便通过Python代码进行处理. 文档环境 本文档中代码的测试环境 Beautifu Soup 使用说明 Beautiful Soup 的基本功能就是对HTML的标签进行查找及编辑. 基本概念-对象类型 Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都被转换成一个Python 对象,

python解析xml之lxml

虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍lxml的简单使用. [html]?view plain?copy ? 例子:dblp.xml(dblp数据的片段)?? <?xml?version='1.0'?encoding='utf-8'?>???? <dblp>?? ???????<article?mdate="

python提取页面信息beautifulsoup正则lxml

beautifulsoup正则lxml # -*- coding: utf-8 -*- import re from urllib.request import urlopen from urllib.request import Request from bs4 import BeautifulSoup from lxml import etree #添加模拟浏览器协议头 headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT

Python_爬虫_BeautifulSoup网页解析库

BeautifulSoup网页解析库 from bs4 import BeautifulSoup 0.BeautifulSoup网页解析库包含 的 几个解析器 Python标准库[主要,系统自带;] 使用方法: BeautifulSoup(markup,"html.parser")[注:markup是html文档] Python的内置标准库 案例: ` from bs4 import BeautifulSoup ` soup = BeautifulSoup.(html,'html.pa