淺析Beautiful Soup庫和Lxml庫

RainbowJhon發表於2018-07-12

眾所周知,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,就仁者見仁,智者見智了。


相關文章