美文网首页Python
利用Xpath提取HTML节点

利用Xpath提取HTML节点

作者: 苦逼李 | 来源:发表于2018-03-28 21:31 被阅读7次

目录

  • 什么是Xpath?
  • 常见的Xpath中节点及节点间的关系
  • Xpath路径表达式(节选)

2018.3.28更新

补充说明了 /(根节点的作用)

说明了///的区别


什么是Xpath?

Xpath是XML-路径语言的简称。顾名思义,Xpath可以用于定位XML文本的节点,但实际上,Xpath也适用于定位HTML中的节点。

节点及节点间的关系

在HTML中,节点就是一个个HTML标签。分析节点间的关系也就是要清楚HTML文档中各标签间的关系。厘清这些关系对于书写Xpath路径表达式来说非常重要。

节点间的关系(下面通过一段HTML代码说明:)

<div class="header-wrapper">    
    <a href="http://www.baidu.com">
    <a href="http://blog.jobbole.com"><img src="xxx" alt="文章" /></a>
</div>

父节点(Parent)

元素div是元素a的父节点;第二个元素a也是元素img的父节点。

子节点(Children)

元素a是元素div的子节点;元素img是子节点。

兄弟/同胞节点(Sibling)

兄弟节点在HTML中的地位相等,它们有相同的父节点。如上面例子中,两个a元素互为兄弟节点。

先辈节点(Descendant)

对于img元素来说,它的父节点(第二个a元素),和它的父节点的父节点(元素div)统称为img的先辈节点。在一个HTML文件中,先辈节点一般不唯一,比如这里的例子中,元素img的先辈节点包含两个元素。

后代节点(Descendant)

对于img元素来说,它的子节点(第二个a元素),和它的子节点的子节点(元素img)统称为div的后代节点。

在使用Xpath中,搞清楚节点间的关系是非常重要的。

Xpath路径表达式(节选)

XPath 使用路径表达式来选取 XML 文档(或是HTML文档)中的节点或节点集。下面列举一些常见的路径表达式。

路径表达式 描述
/div/p 选取div下的所有p节点(p必须是div的子节点)
/div//a 选取div下所有a节点而不考虑其位置(a标签只要是div的子孙节点即可)
@class 选取名为class的属性
/div/.. 选取div的父节点
  • / 表示从根节点开始(html文件中是html节点),而根节点后不一定是div节点,但为了表达简洁,省略了div节点前的部分路径表达式,后面也是。实际使用时需要注意。

再看稍微复杂的情况

路径表达式 描述
/div/a 从根节点开始选取div节点下的a节点
/div/a[2]/img 从根节点开始选取div节点下的第二个a节点下的img节点
//div[@class="header-wrapper"] 选取所有属性class的值为header-wrapper的div节点
  • 在节点后加上带有数字的方括号,可以根据兄弟节点在文档中出现的先后次序选择元素(数字1为第一个依次类推)。如果说我想取一个元素,而它从倒数来看更加方便,那该如何取呢?后面将说明这种方法。
  • 通过在节点后加上带有属性名-值对的方括号,可以筛选出需要的节点。属性值的写法为:@属性名=“属性值”

选取位置元素和属性

路径表达式 描述
//*/di 选取文档中所有元素
//@* 选取文档中所有带属性的元素

最后介绍Xpath中一些常用的函数

路径表达式 描述
/div/p/text() 选取p节点的文本内容
//div[contains(@class,"post")] 选取带有class属性且值包含“post”的所有div节点
/div/p[last()-1] 选取div下倒数第二个p节点 注:last()后的数字没有表示倒数第一
  • 适用路径表达式时必须将其包围在一对单引号(或双引号)中。如果路径表达式外是双引号,则路径表达式中的属性值必须用单引号;如果路径表示外是单引号,则路径表达式中的属性值必须用双引号,以此来避免歧义。
  • contains函数在提取一个带有多值属性的节点时很有帮助

选取多个元素——在路径表示中使用'|'

路径表达式 描述
/div/a | /div/p 选取div下的a节点和div下的p节点

更新ing..

相关文章

网友评论

    本文标题:利用Xpath提取HTML节点

    本文链接:https://www.haomeiwen.com/subject/xbzucftx.html