xiaoflyfly 发表于 2019-1-6 14:54:26

爬虫——使用XPath——XPath提供了非常简明的路经选择表达式

from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html"><span>first item</span></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>
'''
html = etree.HTML(text)
#所有节点
#*代表匹配所有的节点,也可以匹配特点的节点
result1 = html.xpath('//*')
#子节点
#通过/或//可查找元素的子节点和孙节点
#/用于选取子节点,//用于选取孙节点,如果要获取所有子孙节点,就可以使用//
result2 = html.xpath('//li/a')

#父节点
#查找父节点可以通过..parent::和来实现
result3 = html.xpath('//a[@href="link4.html"]/../@class')
result4 = html.xpath('//a[@href="link4.html"]/parent::*/@class')
#匹配属性
result5 = html.xpath('//li[@class="item-0"]')
#文本获取
result6 = html.xpath('//li[@class="item-0"]/text()')
##获取li节点内部的文本,一种先选取a节点在获取文本, 另一种就是使用//
result7 = html.xpath('//li[@class="item-0"]/a/text()')
result8 = html.xpath('//li[@class="item-0"]//text()')
#属性获取(用@符号获取节点属性)
result9 = html.xpath('//li/a/@href')

text = '''
<li class="li li-first" name="item"><a href="link.html">first item</a><li>
'''
html1 = etree.HTML(text)
result10 = html1.xpath('//li/a/text')
#这里的HTML文本中的li节点的class属性有两个值li/li-first,此时如果还想用之前的匹配获取,就无法匹配了
#利用contains()方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值就可匹配
result11 = html1.xpath('//li/a/text()')

#多属性匹配
#XPath中有and/or/mod|/+等运算符
result12 = html1.xpath('//li/a/text()')
# print(result12)
#按顺序选择
result13 = html.xpath('//li/a/text()')
# print(result13)
result14 = html.xpath('//li/a/text()')
# print(result14)
result15 = html.xpath('//li/a/text()')
# print(result15)
result16 = html.xpath('//li/a/text()')
# print(result16)
#这里的序列是从1开始的,而不是从0开始,last()是最后一个,last()-2为导数第三个,而position<3, 为前2个
#在XPath中提供了100多个函数,可参考:https://www.cnblogs.com/zhangfei/archive/2013/02/27/2935264.html
#节点轴选择
##调用ancetor轴,可以获取所有的祖先节点,其后需要跟两个冒号,然后是节点选择器:*表示匹配所有的节点
result17 = html.xpath('//li/ancestor::*')
# print(result17)
#在后面加上div限制,还可以加html/boby/div/ul等
result18 = html.xpath('//li/ancestor::div')
print(result18)
#调用attribute轴,可以获取所有的属性值,其后跟的选择器还是*,这代表获得该节点的所有的属性
result19 = html.xpath('//li/attribute::*')
print(result19)
#调用child轴,可以获得所有直接子节点。这里加了限定条件,选取href属性为link1.html的a节点
result20 = html.xpath('//li/child::a[@href="link1.html"]')
print(result20)
#调用descendant轴,获取孙节点。
result21 = html.xpath('//li/descendant::span')
print(result21)
#选取following轴,获取当前节点之后的所有节点,虽然使用*匹配,但加了索引
result22 = html.xpath('//li/following::*')
print(result22)
#调用following-slibling轴,可以获取当前节点之后的所有同级节点
result23 = html.xpath('//li/following-sibling::*')
print(result23)



**** Hidden Message *****

jroilee 发表于 2020-1-21 11:34:01

666

Lucases 发表于 2020-2-6 15:34:53

学习来了

EDX 发表于 2020-2-29 20:29:08

666

小志呀 发表于 2020-8-8 14:26:43

1

python_nozomi 发表于 2020-10-2 19:35:55

1

jk1532794827 发表于 2020-10-3 12:11:54

学习学习

Janway88 发表于 2020-10-12 16:03:48

{:5_97:}

雨云天 发表于 2020-10-20 22:03:16

XUEXIXUEXI

jracuss 发表于 2020-10-21 15:58:51

感谢FishC.COM

浩浩学python 发表于 2020-11-7 16:55:47

1

xigarong 发表于 2021-4-26 08:53:21

学习

q00110011 发表于 2022-3-13 00:13:52

2346546465465

BI6MQP 发表于 2022-3-13 01:00:46

66666

洛与春风 发表于 2022-4-26 12:17:11

2

柠檬西瓜汁 发表于 2022-8-1 17:22:33

学习

hela520 发表于 2022-10-8 14:31:04

{:5_106:}
页: [1]
查看完整版本: 爬虫——使用XPath——XPath提供了非常简明的路经选择表达式