Logo

郎哥编程

XPath轴定位

2020-08-24 275

XPath轴以节点关系为定位路径,通过节点间的关系选取节点或节点集,XPath轴可以使用到路径表达式中。

XPath轴定位语法如下:

轴名称::节点名称[谓词]

其中轴名称是XPath定义的轴的名称,节点名称是XPath节点的名称,谓词是可选的。

在后面的案例中使用下面给出的HTML内容,执行案例程序时,需要把下面的HTML内容保存到本地,文件名是sample.html,编码格式是utf-8。

<html>
<head>
      <title>落花生与济南的冬天</title>
     
</head>
<body>
        <div id="id_title">
            <a href="#article1"  target="_self">落花生</a>
            <a href="#article2"  target="_self">济南的冬天</a>
       </div>
       <a name="article1"></a>
       <h1>落花生</h1>
      <h5>许地山</h5>
      <hr>
      <p>
            我们家的后园有半亩空地。母亲说:“让它荒着怪可惜的,你们那么爱吃花生,就开辟出来种花生吧。”我们姐弟几个都很高兴,买种,翻地,播种,浇水,没过几个月,居然收获了。
     </p>
     <p>
            母亲说:“今晚我们过一个收获节,请你们的父亲也来尝尝我们的新花生,好不好?”母亲把花生做成了好几样食品,还咐附就在后园的茅亭里过这个节。
   </p>
   
    <a name="article2"></a>
    <h1>济南的冬天</h1>
      <h5>老舍</h5>
      <hr>
      <p style="font-weight:bolder">
           对于一个在北平住惯的人,像我,冬天要是不刮风,便觉得是奇迹;济南的冬天是没有风声的。对于一个刚由伦敦回来的人,像我,冬天要能看得见日光,便觉得是怪事;济南的冬天是响晴的。自然,在热带的地方,日光是永远那么毒,响亮的天气,反有点叫人害怕。可是,在北中国的冬天,而能有温晴的天气,济南真得算个宝地。
     </p>
          设若单单是有阳光,那也算不了出奇。请闭上眼睛想:一个老城,有山有水,全在天底下晒着阳光,暖和安适地睡着,只等春风来把它们唤醒,这是不是个理想的境界?
     <p>
   </div>
</boyd>
</html>

XPath定义的轴如下表所示(表中的实例取自sample.html):

a002.png

案例1:选取属性name值为article1a的a节点之后的所有兄弟节点

#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
    #使用r模式打开文件,编码方式为utf-8
    fp = open(filename,"r",encoding='utf-8')
    content = fp.read()
    #关闭文件对象
    fp.close()
    # 读取HTML文档内容,返回选择器
    selector = etree.HTML(content)
    #选取属性name值为article1a的a节点之后的所有兄弟节点
    select = selector.xpath("/html/body/a[@name='article1']/following-sibling::*")
    print(select)
       
except IOError:
     print("文件打开失败,%s文件不存在" % filename)

程序执行结果如下所示:

[

<Element h1 at 0x1daf6ee9480>,

<Element h5 at 0x1daf6ee94c0>,

<Element hr at 0x1daf6ee9500>,

 <Element p at 0x1daf6ee9540>,

 <Element p at 0x1daf6ee9580>,

<Element h1 at 0x1daf6ee9600>,

<Element h5 at 0x1daf6ee9640>,

 <Element hr at 0x1daf6ee9680>,

<Element p at 0x1daf6ee96c0>,

<Element p at 0x1daf6ee95c0>

]

案例2:选取属性id值为id_title的div节点所有的子节点

#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
    #使用r模式打开文件,编码方式为utf-8
    fp = open(filename,"r",encoding='utf-8')
    content = fp.read()
    #关闭文件对象
    fp.close()
    # 读取HTML文档内容,返回选择器
    selector = etree.HTML(content)
    #选取属性id值为id_title的div节点所有的子节点
    select = selector.xpath("/html/body/div[@id='id_title']/child::*")
    print(select)
       
except IOError:
     print("文件打开失败,%s文件不存在" % filename)

程序执行结果如下所示:

[

<Element a at 0x1767096a5c0>,

 <Element a at 0x1767096a600>

]

案例3:选取html后代所有节点且名称为title的节点

#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
    #使用r模式打开文件,编码方式为utf-8
    fp = open(filename,"r",encoding='utf-8')
    content = fp.read()
    #关闭文件对象
    fp.close()
    # 读取HTML文档内容,返回选择器
    selector = etree.HTML(content)
    #选取html后代所有节点且名称为title的节点
    select = selector.xpath("/html/descendant::title")
    print(select)
       
except IOError:

     print("文件打开失败,%s文件不存在" % filename)

程序执行结果如下所示:

[

<Element title at 0x2870821b400>


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论