总结PYTHON中不太好描述的xpath用法,不定时更新
-
情形1,
<br>
标签将一段文字隔开
如上图,我想分别提取演员信息(导演…)、影片类别(1993/…),则用xpath写成如下, 可以达到目的。
div[@class='']/text()[1]
对应演员信息
div[@class='']/text()[2]
对应影片类别
总结:text()支持下标操作:/text()[1]
-
情形2,多个同级标签的选择
如上图,两个同级<p>
标签,怎么指定某一个?其实与1同理,<p>
标签的 选择也支持下标操作:
div[@class='bd']/p[1]/text()[1]
选择第一个<p>
标签。 -
xpath的方括号代表谓语,其中可以写成逻辑表达式.
(标签的属性,实质上是位于标签的下一级别.如取出上图中的p标签的class属性,则使用/div/p/@class
).
基于上述知识,我们在方括号中写的表达式相当于对当前标签的下一级(是不是标签下多级不确定)进行操作. -
选择具有 或者 不具有 某种特定子节点的节点.
比如在上图中,最外层的div标签下有p标签,h3标签,h4标签, 这三种标签中都有文字信息,但是某些p标签下有iframe元素(网页中的图表),这是我想剔除的标签.问如何选择以上三种标签并剔除带有iframe的p标签?
首先我们先选择div标签下的所有直接子节点//div[@id="webEditContent"]/*
,但是iframe是位于div的子节点的子节点,也就是某些p标签的子节点,现在我们直接在上述表达式后加方括号进行谓语的编写就相当于对p标签的子节点进行操作.于是我们得到xpath://div[@id="webEditContent"]/*[not(iframe)]
这样就剔除了有iframe子节点的p标签.
说的可能不是很明白,大家可以读一下这篇文章
https://www.w3school.com.cn/xpath/xpath_syntax.asp
- 刚才用到的知识点1:not(), 类似的谓语逻辑词还有
and, contains(,), or, last(), position(), child()
…等等 - 刚才用到的知识点2: 在div标签的方括号直接写标签名称p,表示选择有p子节点的div标签