[Python] – 爬虫之lxml库的用法
HTML 示例代码
0 1 2 3 4 5 6 7 8 9 10 |
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">third item</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> ''' |
小试牛刀
使用 lxml
的 etree
库,将其打印出来
0 1 2 3 4 5 6 7 8 9 |
# 导入 lxml etree 库 from lxml import etree # 获取 html 内容 元素 htmlEmt = etree.HTML(text) # 将内容元素转换为字符串 result = etree.tostring(htmlEmt) # utf-8 格式输出 print(result.decode("utf-8")) |
打印结果为:
0 1 2 3 4 5 6 7 8 |
<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">third item</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> |
lxml 有自动修正 HTML 代码的功能
文件读取
利用 parse 方法来读取文件
文件名:text.xml
内容:
0 1 2 3 4 5 6 7 8 |
<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> |
0 1 2 3 4 5 6 7 |
from lxml import etree # text.xml 是一个 xml 文件,并在当前文件同目录下 htmlEmt = etree.parse('text.xml') # pretty_print: 优化输出 result = etree.tostring(htmlEmt, pretty_print=True) # 输出 print(result) |
同样可以得到相同的结果
XPath实例测试
以上一段 text.xml
文件为例
获取所有的 <li>
标签
0 1 2 3 4 5 6 7 8 9 10 |
from lxml import etree # 获取文件元素 htmlEmt = etree.parse('text.xml') # 获取所有的 <li> 标签 result = htmlEmt.xpath('//li') print(result) # 获取标签数量 print(len(result)) # 取出第一个 li 标签 print(result[0]) |
输出结果:
0 1 2 |
[<Element li at 0x1023fc0c8>, <Element li at 0x1023fc108>, <Element li at 0x1023fc148>, <Element li at 0x1023fc188>, <Element li at 0x1023fc1c8>] 5 <Element li at 0x1023fc0c8> |
获取 <li>
标签的所有 class
0 1 |
result = htmlEmt.xpath('//li/@class') print(result) |
输出结果:
0 |
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0'] |
获取 <li>
标签下 href
为 link1.html
的 <a>
标签
0 1 2 |
result = htmlEmt.xpath('//li/a[@href="link1.html"]') print(result) print(result[0].text) |
输出结果:
0 1 |
[<Element a at 0x1023fc208>] first item |
获取 <li>
标签下的所有 <span>
标签
因为 /
是用来获取子元素的,而 <span>
并不是 <li>
的子元素,所以,要用双斜杠
0 1 2 |
result = html.xpath('//li//span') print(result) print(result[0].text) |
输出结果:
0 1 |
[<Element span at 0x1023fc0c8>] third item |
获取 <li>
标签下的所有 class
,不包括 <li>
标签的 class
0 1 |
result = html.xpath('//li/a//@class') print(result) |
输出结果:
0 |
['bold'] |
获取最后一个 <li>
的 <a>
的 href
0 1 |
result = html.xpath('//li[last()]/a/@href') print(result) |
输出结果:
0 |
['link5.html'] |
获取倒数第二个元素的内容
0 1 |
result = html.xpath('//li[last()-1]/a') print(result[0].text) |
输出结果:
0 |
fourth item |
获取 class
为 bold
的标签名
0 1 2 |
result = html.xpath('//*[@class="bold"]') print(result[0].tag) print(result[0].text) |
输出结果:
0 1 |
span third item |