一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Python網(wǎng)頁解析:BeautifulSoup vs lxml.html

 imelee 2017-02-28

Python里常用的網(wǎng)頁解析庫有BeautifulSoup和lxml.html,其中前者可能更知名一點吧,熊貓開始也是使用的BeautifulSoup,但是發(fā)現(xiàn)它實在有幾個問題繞不過去,因此最后采用的還是lxml:

  1. BeautifulSoup太慢。熊貓原來寫的程序是需要提取不定網(wǎng)頁里的正文,因此需要對網(wǎng)頁進行很多DOM解析工作,經(jīng)過測試可以認(rèn)定BS平均比lxml要慢10倍左右。原因應(yīng)該是libxml2+libxslt的原生C代碼比python還是要更快吧
     
  2. BS依賴python自帶的sgmllib,但是這個sgmllib至少有兩個問題。首先,它解析“class=我的CSS類”這樣的字符串會有問題,參考下面的代碼就知道了。
    from BeautifulSoup import BeautifulSoup
    html = u'<div class=我的CSS類>hello</div>'
    print BeautifulSoup(html).find('div')['class']
    打印出來的結(jié)果是長度為零的字符串,而不是“我的CSS類”。

    不過這個問題可以通過外圍代碼來解決,只要改寫一下sgmllib的attrfind這個查找元素屬性的正則就行,可以改成
    sgmllib.attrfind = re.compile(r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*(\'[^\']*\'|"[^"]*"|[^\s^\'^\"^>]*))?')
    這個問題可以說是網(wǎng)頁書寫不規(guī)范造成的,也不能怨sgmllib吧,但是這和BS原來希望能解析格式不好的HTML的宗旨是相違背的。

    但是第二個問題就比較要命了,參看下面的示例代碼。
    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

    打印出來的結(jié)果是:
    [(u'onclick', u'if(x>10) alert(x);')]

    顯然其中的href屬性被拋棄了,原因就是sgmllib庫在解析屬性的時候一旦遇到了>等特殊符號就會結(jié)束屬性的解析,要解決這個問題,只能修改sgmllib中SGMLParser的parse_starttag代碼,找到292行,即k = match.end(0)這一行,添加下面的代碼即可:
    if k > j:
    match = endbracket.search(rawdata, k+1)
    if not match: return -1
    j = match.start(0)

因此對比起來lxml會好很多,也許在解析某些HTML的時候真的會出問題,但是就現(xiàn)在使用的情況來說還是挺好的。而且lxml的xpath感覺真的很棒,幾年前在折騰ASP.NET/Web Service的時候?qū)W習(xí)過XPath/XSLT之類的東西,但是實用其實挺少的,這次用lxml的xpath,能速度搞定一大堆較繁瑣的元素查找,簡直太爽了。例如要查找所有有name屬性和content屬性的meta元素:

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

下面是判斷元素x是否是元素y的祖節(jié)點的代碼:

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

此外,lxml里還支持string-length、count等XPath 1.0的函數(shù)(參見XPath and XSLT with lxml)。不過2.0的函數(shù),如序列操作的函數(shù)就不行了,這需要底層libxml2和libxslt庫的升級才行。

當(dāng)然,lxml也有它自己的問題,那就是多線程方面貌似有重入性問題,如果需要解析大量網(wǎng)頁,那只能啟動多個進程來試試了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    一区二区不卡免费观看免费| 黑丝国产精品一区二区| 99久久国产精品免费| 国产又黄又猛又粗又爽的片| 91精品国产综合久久精品| 亚洲精品国产福利在线| 在线观看视频日韩精品| 亚洲中文字幕乱码亚洲| 日本一级特黄大片国产| 激情中文字幕在线观看| 91精品欧美综合在ⅹ| 少妇特黄av一区二区三区| 亚洲专区一区中文字幕| 国产精品不卡免费视频| 国产又猛又大又长又粗| 都市激情小说在线一区二区三区| 粗暴蹂躏中文一区二区三区| 日本视频在线观看不卡| 国产精品不卡免费视频| 韩国日本欧美国产三级| 色婷婷中文字幕在线视频| 欧美一区日韩一区日韩一区| 亚洲视频一级二级三级| 中日韩免费一区二区三区| 成人精品视频在线观看不卡| 风韵人妻丰满熟妇老熟女av| 欧美三级精品在线观看| 扒开腿狂躁女人爽出白浆av| 日韩国产中文在线视频| 日韩夫妻午夜性生活视频| 91久久精品国产成人| 国产日韩欧美在线亚洲| 国产偷拍盗摄一区二区| 亚洲高清一区二区高清| 蜜桃传媒视频麻豆第一区| 欧美一级内射一色桃子| 人妻内射在线二区一区| 免费国产成人性生活生活片| 视频在线免费观看你懂的| 国产精品亚洲二区三区| 亚洲内射人妻一区二区|