浅析Beautiful Soup库和Lxml库

来源:互联网 发布:mysql自定义函数 编辑:程序博客网 时间:2024/06/17 02:52

        众所周知,Beautiful SouLxml是两个非常流行的python模块,他们常被用来对抓取到的网页进行解析,以便进一步抓取的进行。作为一个爬虫爱好者,今天我来简单讲讲这两个库各自的优点和不足,不对的地方还请各位大神斧正。

        Beautiful Soup模块可以用来解析网页,并提供定位内容的便捷接口,可以用下面的命令安装其最新版本。

>>>pip install beautifulsoup4

        使用bs4库的第一步是将以下载的HTML内容解析为soup文档,例如以下为一个简单的HTML文件,存在属性值两侧引号缺失和标签未闭合的问题。

<ul class=wgxshr>

    <li>height

    <li>weight

</ul>

        使用bs4库进行处理

>>>from bs4 import BeautifulSoup

>>>broken_html = '<ul class=wgxshr><li>height<li>weight</ul>'

>>>soup = BeautifulSoup(broken_html, 'html.parser')

>>>fixed_html = soup.prettify()

>>>print fixed_html

<html>

    <body>

        <ul class="wgxshr">

           <li>height</li>

           <li>weight</li>

        </ul>

    </body>

</html>

        从上面的执行结果可以看出来,BeautifulSoup 能够正确的解析缺失的引号并闭合标签,此外还添加了<html><body>标签使其成为完整的HTML文档,然后可以使用find()find_all()方法定位我们需要的元素。

        但是,需要注意的是,由于这里使用的是python内置库,由于不同的版本容错能力不同,这里解析出来的HTML文件可能是错误的,即weight列表项被解析为height列表项的子元素,而这种错误在实践中很难被发现。另外,由于bs4python的原生库,相比lxml的libxml2+libxslt的原生C代码慢很多。

        lxml是另一个python爬虫的常用库,它是基于libxml2这一XML解析库的python封装,速度比BeautifulSoup快。使用lxml的第一步也是将有可能不合法的HTML解析为同一格式。例如:

>>>import lxml.html

>>>broken_html = '<ul class=wgxshr><li>height><li><weight></ul>'

>>>tree = lxml.html.fromstring(broken_html)

>>>fixed_html = lxml.html.tostring(tree, pretty_print=True)

>>>print fixed_html

<ul class="wgxshr">

    <li>height</li>

    <li>weight</li>

</ul>

        同样的,lxml也可以正确解析属性两侧缺失的引号,并闭合标签,但是没有像BeautifulSoup库那样添加额外的<html>和<body>标签。lxml提供了几种不同的不同的用来选择元素的方法,如xpath选择器,css选择器等。

        相较于BeautifulSoup库,lxml更快且更健壮,一般来所,是抓取数据的最佳选择。

        但bs4已经可以依赖于lxml,速度有了大幅度提升,健壮性也大大提高,可以直接soup = BeautifulSoup(html, 'lxml')了。

所以,编写爬虫程序时,究竟是使用正则表达式,,Beautiful Soup还是Lxml,就仁者见仁,智者见智了。



0 0
原创粉丝点击