鱼C论坛

 找回密码
 立即注册
查看: 3180|回复: 16

[技术交流] 爬虫——使用XPath——XPath提供了非常简明的路经选择表达式

[复制链接]
发表于 2019-1-6 14:54:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

#多属性匹配
#XPath中有and/or/mod|/+等运算符
result12 = html1.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
# print(result12)
#按顺序选择
result13 = html.xpath('//li[1]/a/text()')
# print(result13)
result14 = html.xpath('//li[last()]/a/text()')
# print(result14)
result15 = html.xpath('//li[position()<3]/a/text()')
# print(result15)
result16 = html.xpath('//li[last()-2]/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[1]/ancestor::*')
# print(result17)
#在后面加上div限制,还可以加html/boby/div/ul等
result18 = html.xpath('//li[1]/ancestor::div')
print(result18)
#调用attribute轴,可以获取所有的属性值,其后跟的选择器还是*,这代表获得该节点的所有的属性
result19 = html.xpath('//li[1]/attribute::*')
print(result19)
#调用child轴,可以获得所有直接子节点。这里加了限定条件,选取href属性为link1.html的a节点
result20 = html.xpath('//li[1]/child::a[@href="link1.html"]')
print(result20)
#调用descendant轴,获取孙节点。
result21 = html.xpath('//li[1]/descendant::span')
print(result21)
#选取following轴,获取当前节点之后的所有节点,虽然使用*匹配,但加了索引
result22 = html.xpath('//li[1]/following::*[2]')
print(result22)
#调用following-slibling轴,可以获取当前节点之后的所有同级节点
result23 = html.xpath('//li[1]/following-sibling::*')
print(result23)



游客,如果您要查看本帖隐藏内容请回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-21 11:34:01 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 15:34:53 | 显示全部楼层
学习来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 20:29:08 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-8 14:26:43 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-2 19:35:55 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-3 12:11:54 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-12 16:03:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-20 22:03:16 | 显示全部楼层
XUEXIXUEXI
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-21 15:58:51 | 显示全部楼层
感谢FishC.COM
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 16:55:47 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-26 08:53:21 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 00:13:52 | 显示全部楼层
2346546465465
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-13 01:00:46 | 显示全部楼层
66666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-26 12:17:11 | 显示全部楼层
2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-1 17:22:33 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-8 14:31:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 09:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表