1.Xpath概览
1 # 1.介绍:
2 Xpath,全称XML PathLanguage,即XML路径语言,它是一门在XML文档中查找信息的语言.
3 Xpath的选择功能十分强大,它提供了非常简洁明了的路径选择表达式.另外,它还提供了超过100个内置函数,用于字符串,数值,时间的匹配以及节点,序列的处理等.
4
5 #2.安装:
6 pip install lxml
返回顶部
2.Xpath常用解析规则
| 表达式 | 描述 |
nodename |
选取此节点的所有子节点 |
/ |
从当前节点选取直接子节点 |
// |
从当前节点选取子孙节点 |
. |
选取当前节点 |
.. |
选取当前节点的父节点 |
@ |
选取属性 |
返回顶部
3.Xpath解析步骤与初体验
1 # 使用步骤:
2
3 # 1.导入模块:
4 from lxml import etree
5
6 # 2.实例化etree对象, text为爬取数据得到的文本数据
7 tree = etree.HTML(text)
8
9 # 3.etree对象配合Xpath表达式定位标签或获取文本及属性
10 tag = tree.xpath(表达式)
返回顶部
1 # 示例:获取所有a标签的href属性值, 三引号内容为test.html文件内容
2 '''
3 <!DOCTYPE html>
4 <html lang="en">
5 <head>
6 <meta charset="UTF-8">
7 <title>Title</title>
8 </head>
9 <body>
10 <ul class='test'>
11 <li><a href="www.baidu1.com"></a></li>
12 <li><a href="www.baidu2.com"></a></li>
13 <li><a href="www.baidu3.com"></a></li>
14 <li><a href="www.baidu4.com"></a></li>
15 </ul>
16 </body>
17 </html>
18 '''
19
20 from lxml import etree
21 tree = etree.parse('./test.html', etree.HTMLParser())
22 a_href = tree.xpath('//ul[@class="test"]/li/a/@href')
23 print(a_href)
24
25 # 输出结果为:
26 ['www.baidu1.com','www.baidu2.com','www.baidu3.com','www.baidu4.com']
27
28 #注意: 上面里子是本地加载html文件进行解析, 但爬虫一般是从网页直接获取html进行解析的, 所以应将第 21 行代码替换为:
29 text = response.text()
30 tree = etree.HTML(text)
返回顶部
4.节点匹配
1 # 示例中得文本是response.text获取到的文本, response是通过请求模块从网络请求到的响应, 如下:
2 text = response.text
3 '''
4 <div class="item-0">
5 <ul>
6 <li>no.1</li>
7 <li>no.2</li>
8 <li>这是一个a标签:<a href="baidu.com">跳转至百度</a></li>
9 <li>这是一个a标签:<a href="google.com">跳转至谷歌</a></li>
10 <li class="li li-last" name="item">no.4</li>
11 </ul>
12 </div>
13 '''
返回顶部
1 # 示例: 匹配所有li标签
2 from lxml import etree
3 tree = etree.HTML(text)
4
5 # 1.子节点: 通过/或//即可查找元素的子节点或子孙节点
6 # 示例: 匹配所有li标签
7 # 思路:使用//从文本的任意位置匹配ul标签, 在从ul下匹配其子节点li
8 html = tree.xpath('//ul/li')
9 print(html)
10
11 # 2.父节点: 在书写xpath表达式是可以实现两个点".."实现定位某个标签的父节点
12 # 示例: 匹配a标签, 定位其父节点, 取出li标签中的文本: "这是一个a标签:"
13 # 先定位a标签, 在定位其父节点, 然后在去文本
14 html = tree.xpath('//a/../text()')
15 print(html)
16
17 # 3.属性匹配: 定位标签是可以通过标签的属性值进行定位, 在标签后加[@属性名="属性值"]
18 # 示例: 通过a标签的href属性获取a标签内的文本
19 # 思路: 通过属性href的值为baidu.com来定位a标签, 在用text()获取文本
20 html = tree.xpath('//a[@href="baidu.com"]/text()')
21 print(html)
22
23 # 4.属性多值匹配:当一个标签的某一属性包含多个值时, 想根据其中一个值定位标签, 可以使用contains()函数
24 # 示例: 根据class的值li-last定位li标签后获取其文本no.4
25 # 思路: 使用contains()函数, 语法为[contains(@class, "li-last")]
26 html = tree.xpath('//li[contains(@class, "li-last")]'/text())
27 print(html)
28
29 # 5.多属性匹配: 如果需要根据标签的多个属性进行定位, 可以使用and语法连接多个属性
30 # 示例: 根据li标签class的li-last值以及name属性的值进行定位, 获取文本no.4
31 html = tree.xpath('//li[contains(@class, "li-last") and @name="item"]/text()')
32
33 # 6.索引与位置信息对匹配进行筛选: 涉及索引, last()函数, position()函数
34 # 示例: 获取所有li标签, 利用索引定位到第一个, 取其文本
35 html = tree.xpath('//li[1]/text()')
36 print(html)
37
38 # 示例: 获取前两个里标签
39 html = tree.xpath('//li[position()<3]/text()')# 结果: ['no.1', 'no.2']
40 print(html)
41
42 # 示例: 获取最后一个li标签的文本
43 html = tree.xpath('//li[last()]/text()')
44 print(html)
45
46 # 7.节点轴匹配:使用不多(后续补上)
47 ancestor:祖先节点
48 attribute:获取属性
49 child:子节点
50 following:后续节点(内部)
51 following-sibling:后续同级节点
返回顶部
5.目标数据提取
1 # 1.标签文本提取:使用text()函数
2 # 示例: 获取第一个li标签的文本
3 html = tree.xpath('//li[1]/text()')
4 print(html)
5
6 # 2.标签属性提取: 使用'@属性名'提取
7 # 示例: 根据class值包含li-last定位li标签, 获取其name属性值
8 html = tree.xpath('//a[contains(@class, "li-last")]/@name')
返回顶部