Python解析库(一):使用XPath

XPath最初是用来搜寻XML文档的,但是同样可以用来解析HTML文档

 

1、XPah的常用规则:


表达式                                    描述


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

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

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

      .                                   选取当前节点

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

    @                                   选取属性


例如:

//title[@lang='eng']

这是一个XPath规则,他代表选取所有名称为title,同时属性为lang的值为ang的节点。

2.关于lxml库中的etree模块:


       先用etree模块申明一段HTML文本,etree模块可自动补全HTML文本,

       然后调用tostring()方法输出修正后的HTML文本,结果为bytes型

       利用decode()方法转化为str类型


3.所有节点:


      用//开头选取所有符合要求的节点,声明文本后,调用xpath()方法,例如:xpath(//节点名称)

      返回的为列表,其中的每一个元素都是一个Element对象,可选择中括号加索引的形式取出其中的一个对象


4.子节点:


     通过//和/来获取当前节点的子节点或者子孙节点;

     /用来获取直接子节点,例如result=html.xpath(//li/a)

     //用来获取子孙节点,例如result=html.xpath(//ul//a)


5.父节点:


  用. .来查找父节点

  比如:

from lxml import etree

html = etree.parse('./text.html' , etree.HTMLParser())

result = html.xpath('//a[@href="link4.html"]/. ./@class']

print(result)

当然,. .可以用parent::来替换


6.属性匹配:


比如要选取class为item-0的li节点,可以这样实现:

from lxml import etree

html=etree.parse('./text.html',etree.HTMLParser())

result = html.xpath('//li[@class='items-0']')

print(result)


7.文本获取:


可以利用XPath中的text()方法获取其中节点中的文本

选取相应的节点获取文本

from lxml import etree

html = etree.parse('./text.html' , etree.HTMLParser())

result = html.xpath('//li[@class="item-0"]/a/text()')

print(result)

利用//来实现选取结果

from lxml import etree

html = etree.parse('./text.html' , etree.HTMLParser())

result = html.xpath('//li[@class="item-0"]/a/text()')

print(result)


8.按序选择:


在li节点的括号中传入数字1即可,这里的序号是以1开头,不是0

例如:result = html.xpath('//li[1]/a/text()')

在括号中传入last()可知,获取的便是最后一个li节点

例如:result = html.xpath('//li[last()]/a/text()')

选取位置小于3的li节点,利用position()函数实现

例如:result = html.xpath('//li[position()<3]/a/text()')

获取倒数第三个li节点:用last()实现

例如:result = html.xpath('//li[last()-2]/a/text()')


9.节点轴的选取:


节点的轴方法,可获取子元素,兄弟元素,父元素,祖先元素等

result = html.xpath('//li[1]/ancestor::*') #ancestor轴,用于获取所有祖先元素

result = html.xpath('//li[1]/ancestor::div')#加限定条件div

result = html.xpath('//li[1]/child::a[href="link1.html"]')#获取相应属性的子节点

result = html.xpath('//li[1]/descendant::span')#descendant获取所有的子孙节点,span是限定条件

result = html.xpath('//li[1]/following::*[2]')#following轴,获取当前节点之后的所有节点,但是这里加了索引限制

result = html.xpath('//li[1]/following-sibling::*')#follow-sibling轴,可以获取当前节点之后的所有同级节点


 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值