使用XPath下

该文介绍了如何利用Python的lxml库和XPath表达式来解析HTML文档,包括获取节点的属性(如href),处理属性多值匹配,多属性匹配,按序选择节点,以及使用不同的节点轴选择方法,如子元素、兄弟元素、父元素和祖先元素等。
摘要由CSDN通过智能技术生成

1.属性获取

例如,我们想获取所有li节点下所有a节点的href属性:

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//li/a/@href')
print(result)

这里我们通过@href即可获取节点的href属性。此处和属性匹配的方法并不同,属性匹配是中括号加属性名和值来限定某个属性,如[@href="link1.html"],而此处的@href指的是获取节点的某个顺序。

2.属性多值匹配

有时某些节点的某个属性可能有多个值,如:

from lxml import etree
text='''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html=etree.HTML(text)
result=html.xpath('//li[contains(@class, "li")]/a/text()')
print(result)

这样通过contains()方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配了。

3.多属性匹配

另外我们可能还遇到一种情况,那就是根据多个属性一个节点,这时就需要同时匹配多个属性。此时可以使用运算符and来链接:

from lxml import etree
text='''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html=etree.HTML(text)
result=html.xpath('//li[contains(@class, "li") amd @name="item"]/a/text()')
print(result)

这里的li节点又增加了一个属性name。要确定这个节点,需要同时根据class和name属性来选择,一个条件是class属性里面包含li字符串,另一个条件是name属性为item字符串,二者相连后置于中括号内进行条件筛选。

4.按序选择

当我们在选择的时候某些属性可能同时匹配多个节点,这时我们可以利用中括号传入索引的方法获取特定次序的节点,如:

from lxml import etree
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</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)
result=html.xpath('//li[1]/a/text()')
print(result)
result=html.xpath('//li[last()]/a/text()')
print(result)
result=html.xpath('//li[position()<3]/a/text()')
print(result)
result=html.xpath('//li[last()-2]/a/text()')
print(result)

5.节点轴选择

XPath提供了很多节点轴选择方法,包括获取子元素、兄弟元素、父元素、祖先元素等,如:


from lxml import etree
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html">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)
result=html.xpath('//li[1]/ancestor::*')
print(result)
result=html.xpath('//li[1]/ancestor::div')
print(result)
result=html.xpath('//li[1]/attribute::*')
print(result)
result=html.xpath('//li[1]/child::a[@href="link1.html"]')
print(result)
result=html.xpath('//li[1]/descendant::span')
print(result)
result=html.xpath('//li[1]/following::*[2]')
print(result)
result=html.xpath('//li[1]/following-sibling::*')
print(result)

第一次选择时,我们调用了ancestor轴,其后需要跟两个冒号,然后时节点选择器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值