Xpath解析库的使用

keyiXpath常用规则:

nodename:选取此节点的所有节点

/:从当前节点选取直接子节点

//:从当前节点选取子孙节点

. :选取当前节点

.. :选取当前节点的父节点

@ :选取属性

例:

//title[@lan='eng'] 代表选择所有名称为title,同时属性lang的值为eng的节点。

所有节点:一般用//开头的Xpath规则来选取所有符合要求的节点,先导入etree模块

from lxml import etree
html=etree.parse('./text.html',etree.HTMLParse())
result=html.xpath('//*')
print(result)

这样就找出一个html文本中的所有节点,这里*代表匹配所有节点。此处匹配也可以指定节点名称,如果想获取所有li节点,只需要把上述代码中的result=html.xpath('//*')换成result=html.xpath('//li'),这里要选取所有li节点,可以使用//,然后直接加上节点名称即可,调用时直接使用Xpath()方法即可。

子节点:一般通过/或//即可查找元素的子节点或子孙节点。

result=html.xpath('//li/a')

这里通过追加/a即选择了所有li节点的所有直接a子节点。因为//li用于选中所有li节点,/a用于选中li节点的所有直接子节点a,二者组合在一起即可获取所有li节点的所有直接a子节点。此处的/用于选取直接子节点,如果想要获取所有子孙节点,就可以用//。例如,要获取ul节点下所有的子孙a节点,可以这样实现:result=html.xpath('//ul//a')。

父节点:可以用..来找到已知子节点的父节点。例如,首先选中herf属性为link4.html的a节点,然后再获取其父节点,然后再获取其class属性,其相关代码如下:

from lxml import etree
html=etree.parse('./test.html',etree.HTMLParse())
result=html.xpath('//a[@herf="link4.html"]/../@class')
print(result)

同时我们也可以用parent::来获取父节点。如:result=html.xpath('//a[@herf="link4.html"]/parent::*/@class')

属性匹配:在选取的时候我们可以用@符号进行属性过滤。如:result=html.xpath('//li[@class="item-0"]'),这里我们通过加入[@class="item-0"],限制了节点的class属性为item-0,只提取了文本中class属性为item-0的节点。

文本获取:在后面加上/text()就将匹配的元素转换成文本形式。result=html.xpath('//li[@class="item-0"]/text()')

属性获取:我们可以用text()来获取节点的内部文本那么节点属性还是可以用@符号,比如我们想获取li节点下所有a节点的herf属性,result=html.xpath('//li/a/@herf'),这里我们通过@herf即可获取节点的herf属性。注意,此处和属性匹配的方法不同,属性匹配是中括号加属性名和值来限定某个属性,如[@herf="link1.html"],而此处的@herf指的是获取节点的某个属性,二者需要做好区分。

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

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

这里的HTML文本中li节点的class属性有两个值li和li-frist,此时如果还想用之前的属性匹配的方式获取就无法匹配了,这是就得用contains()函数了result=html.xpath('//li[contains(@class,"li")]/a/text()')

多属性匹配:另外,我们还可能遇到一种情况,那就是格局多个属性确定一个节点,这时就需要同时匹配多个属性,此时可以用运算符and来连接,示例如下:

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值