Welcome To Jeremy's Blog --------------------------            JeremyYu

1.5 数据解析 -- lxml与xpath


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')

 

返回顶部

posted on 2018-03-13 22:22  Jeremy_Yu  阅读(132)  评论(0)    收藏  举报

导航