lxm是python的一個html/xml解析並建立dom的庫,lxml的特點是功能強大,效能也不錯,xml包含了ElementTree
,html5lib
,beautfulsoup
等庫,但是lxml也有自己相對應的庫,所以,導致lxml比較複雜,初次使用者很難瞭解其關係。
安裝lxml
lxml安裝依賴
python-devel,libxml2-devel,libxslt-devel,
裝好之後,下載
http://codespeak.net/lxml/lxml-2.2.8.tgz,
tar zxvf lxml-2.2.8.tgz,
然後python setup.py install即可
1. 解析html並建立dom
>>> import lxml.etree as etree
>>> html = '<html><body id="1">abc<div>123</div>def<div>456</div>ghi</body></html>'
>>> dom = etree.fromstring(html)
>>> etree.tostring(dom)
'<html><body id="1">abc<div>123</div>def<div>456</div>ghi</body></html>'
如果用beautifulsoup的解析器,則
>>> import lxml.html.soupparser as soupparser
>>> dom = soupparser.fromstring(html)
>>> etree.tostring(dom)
'<html><body id="1">abc<div>123</div>def<div>456</div>ghi</body></html>'
但是我強烈建議使用soupparser,因為其處理不規範的html的能力比etree強太多。
2. 按照Dom訪問Element
子項目長度
>>> len(dom)
1
訪問子項目:
>>> dom[0].tag
'body'
逐一查看:
>>> for child in dom:
... print child.tag
...
body
查看節點索引
>>>body = dom[0]
>>> dom.index(body)
0
位元組點擷取父節點
>>> body.getparent().tag
'html'
訪問所有子節點
>>> for ele in dom.iter():
... print ele.tag
...
html
body
div
div
3. 訪問節點屬性
>>> body.get('id')
'1'
也可以這樣
>>> attrs = body.attrib
>>> attrs.get('id')
'1'
4. 訪問Element的內容
>>> body.text
'abc'
>>> body.tail
text只是從本節點開始到第一個位元組點結束;tail是從最後一個位元組結束到本節點未知。
訪問本節點所有文本資訊
>>> body.xpath('text()')
['abc', 'def', 'ghi']
訪問本節點和子節點所有文本資訊
>>> body.xpath('//text()')
['abc', '123', 'def', '456', 'ghi']
貌似返回本文檔中所有文字資訊
body.text_content()返回本節點所有文本資訊。
5.Xpath的支援
所有的div元素
>>> for ele in dom.xpath('//div'):
... print ele.tag
...
div
div
id=“1”的元素
>>> dom.xpath('//*[@id="1"]')[0].tag
'body'
body下的第1個div
>>> dom.xpath('body/div[1]')[0].tag
'div'
參考:
lxml的官方文檔:http://codespeak.net/lxml/
HtmlParser的效能:http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/