lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML ,支持 XPath (XML Path Language)。
pip3 install lxml==4.4.1
首先我们利用lxml来解析 HTML 代码,先来一个小例子来感受一下它的基本用法。使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。
from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
#Parses an HTML document from a string
html = etree.HTML(text)
#Serialize an element to an encoded string representation of its XML tree
result = etree.tostring(html)
print result
所以输出结果是这样的:
<html><body>
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
</body></html>
不仅补全了 li 标签,还添加了 body,html 标签。
<li>
标签print type(html)
result = html.xpath('//li')
print result
print len(result)
print type(result)
print type(result[0])
运行结果:
<type 'lxml.etree._ElementTree'>
[<Element li at 0x1014e0e18>, <Element li at 0x1014e0ef0>, <Element li at 0x1014e0f38>, <Element li at 0x1014e0f80>, <Element li at 0x1014e0fc8>]
5
<type 'list'>
<type 'lxml.etree._Element'>
可见,每个元素都是 Element 类型;是一个个的标签元素,类似现在的实例。
<Element li at 0x1014e0e18> Element类型代表的就是
<li class="item-0"><a href="link1.html">first item</a></li>
Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。每个element对象都具有以下属性:
1. tag:string对象,标签,用于标识该元素表示哪种数据(即元素类型)。
2. attrib:dictionary对象,表示附有的属性。
3. text:string对象,表示element的内容。
4. tail:string对象,表示element闭合之后的尾迹。
例如:
<tag attrib1=1>text</tag>tail
1 2 3 4
result[0].tag
result[0].text
result[0].tail
result[0].attrib
<li>
标签的所有 classhtml.xpath('//li/@class')
运行结果:
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
<li>
标签下属性 href 为 link1.html 的<a>
标签html.xpath('//li/a[@href="link1.html"]')
运行结果:
[<Element a at 0x10ffaae18>]
<li>
标签下的所有<span>
标签注意这么写是不对的:html.xpath('//li/span')
因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠
html.xpath('//li//span')
运行结果:
[<Element span at 0x10d698e18>]
<li>
标签下的所有 class,不包括<li>
的classhtml.xpath('//li/a//@class')
运行结果:['blod']
<li>
的<a>
的 hrefhtml.xpath('//li[last()]/a/@href')
运行结果:['link5.html']
result = html.xpath('//*[@class="bold"]')
print result[0].tag
运行结果:span
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。