轉:Python網頁解析:BeautifulSoup vs lxml.html

來源:互聯網
上載者:User

標籤:

轉自: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也有它自己的問題,那就是多線程方面貌似有重入性問題,如果需要解析大量網頁,那隻能啟動多個進程來試試了。

轉:Python網頁解析:BeautifulSoup vs lxml.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.