python html parser库lxml的介绍和使用(快速入门)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/marising/article/details/5821090

lxm是python的一个html/xml解析并建立dom的库,lxml的特点是功能强大,性能也不错,xml包含了ElementTreehtml5libbeautfulsoup 等库,但是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/

阅读更多
换一批

没有更多推荐了,返回首页