xpath是什么
XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。
xpath练习
标签定位,取属性值
举例:用法还算简单,使用Xpath Helper练习XPath语法。无非就是定位标签,获取属性值或者文本内容。
应用场景-将提取数据对应组成字典
比如我需要把每部电影的title和region对应起来组成一个字典,可以这样做。
- 用etree方法把html转换为element对象
- 用xpath对这个element对象进行分组,分组的结果也是一个element对象
- 对element对象进行遍历,获取title和region这两个字段的数据,就对这个element对象做xpath。这样可以确保字典的对应关系是正确的。
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87from lxml import etree #导入lxml模块的etree库
text = '''
<ul class="lists">
<li id="26871938" class="list-item" data-title="灭绝" data-score="5.6" data-star="30" data-release="2018" data-duration="93分钟(中国大陆)" data-region="美国" data-director="本·扬" data-actors="迈克尔·佩纳 / 丽兹·卡潘 / 伊瑟尔·布罗萨德" data-category="nowplaying" data-enough="True" data-showed="True" data-votecount="7958" data-subject="26871938">
<ul class="">
<li class="poster">
<a href="https://movie.douban.com/subject/26871938/?from=playing_poster" class="ticket-btn" target="_blank" data-psource="poster">
<img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2579512247.webp" alt="灭绝" rel="nofollow" class="">
</a>
</li>
<li class="stitle">
<a href="https://movie.douban.com/subject/26871938/?from=playing_poster" class="ticket-btn" target="_blank" title="灭绝" data-psource="title">
灭绝
</a>
</li>
<li class="srating">
<span class="rating-star allstar30"></span>
<span class="subject-rate">5.6</span>
</li>
<li class="sbtn">
<a class="ticket-btn" href="https://movie.douban.com/ticket/redirect/?movie_id=26871938" target="_blank">
选座购票
</a>
</li>
</ul>
</li>
<li id="25842038" class="list-item" data-title="理查德·朱维尔的哀歌" data-score="8.3" data-star="45" data-release="2019" data-duration="131分钟" data-region="美国" data-director="克林特·伊斯特伍德" data-actors="保罗·沃尔特·豪泽 / 山姆·洛克威尔 / 奥利维亚·王尔德" data-category="nowplaying" data-enough="True" data-showed="True" data-votecount="24174" data-subject="25842038">
<ul class="">
<li class="poster">
<a href="https://movie.douban.com/subject/25842038/?from=playing_poster" class="ticket-btn" target="_blank" data-psource="poster">
<img src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2578705064.webp" alt="理查德·朱维尔的哀歌" rel="nofollow" class="">
</a>
</li>
<li class="stitle">
<a href="https://movie.douban.com/subject/25842038/?from=playing_poster" class="ticket-btn" target="_blank" title="理查德·朱维尔的哀歌" data-psource="title">
理查德·朱维尔...
</a>
</li>
<li class="srating">
<span class="rating-star allstar45"></span>
<span class="subject-rate">8.3</span>
</li>
<li class="sbtn">
<a class="ticket-btn" href="https://movie.douban.com/ticket/redirect/?movie_id=25842038" target="_blank">
选座购票
</a>
</li>
</ul>
</li>
<li id="30176393" class="list-item" data-title="误杀" data-score="7.7" data-star="40" data-release="2019" data-duration="112分钟" data-region="中国大陆" data-director="柯汶利" data-actors="肖央 / 谭卓 / 陈冲" data-category="nowplaying" data-enough="True" data-showed="True" data-votecount="363824" data-subject="30176393">
<ul class="">
<li class="poster">
<a href="https://movie.douban.com/subject/30176393/?from=playing_poster" class="ticket-btn" target="_blank" data-psource="poster">
<img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2576090251.webp" alt="误杀" rel="nofollow" class="">
</a>
</li>
<li class="stitle">
<a href="https://movie.douban.com/subject/30176393/?from=playing_poster" class="ticket-btn" target="_blank" title="误杀" data-psource="title">
误杀
</a>
</li>
'''
html = etree.HTML(text)
# print(html) #结果是elment对象
# html_str = etree.tostring(html).decode() #自动修正html代码。假设我漏写了其中一个</li>,这个方法会帮我们补全标签
# print(html_str)
title = html.xpath("//li[@class='list-item']/@data-title")
region = html.xpath("//li[@class='list-item']/@data-region")
print(title)
print(region)
grp = html.xpath("//li[@class='list-item']")
print(grp) #这是个element对象
for i in grp: #遍历elment对象,将title和region这两个列表组成字典
item = {} #创建空字典,用于填充数据
item["title"] = i.xpath("./@data-title")
item["region"] = i.xpath("./@data-region")
print(item)
总结
- lxml模块的
etree.HTML
这个方法可以把html转换为element对象,我们可以对element对象使用xpath提取数据。 - 把element对象分组再xpath这种方式(第一次xpath:把element对象分成更小的element对象;第二次xpath:从element对象中提取目标数据),可以帮助我们组成一个对应关系完全正确的字典