马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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)
|