[思路]Xpath选取指定两个节点之间的兄弟节点、子节点、孙节点、当前节点等元素或文本内容

Xpath十分强大,不仅支持特殊比较运算符,还支持筛选表达式等常用功能,在批量选取独树一帜。

如果只看方法的,直接跳到下一个三级标题。

今天遇到一个小业务场景,见下图
网站
如何提取name="ContenStart"name="ContenEnd"两个节点的当中的内容?可能大家都想到了兄弟节点。

//meta[@name="ContentStart"]/following-sibling::*

不过使用这种方法,会选取到不需要的其他节点
同级节点
此处可以使用Xpath自带的not方法排除掉table标签,但如果遇到同级标签过多,则会造成表达式冗余,降低可读性。
稍微观察可以发现两个节点之间的标签都是p标签,则可以将"*"换成"p",解决问题。
不过如果两个节点之间不仅仅有p,还有其他标签呢?

万能方法解决选取两个节点之间的内容

主要是Xpath轴的使用,详细轴方法见附。

轴:可定义相对于当前节点的节点集         —w3school

上文的场景,便可以优化为:
向下:

#following选取文档中当前节点的结束标签之后的所有节点。
//meta[@name="ContentStart"]/following::*

向上

#preceding直到所有这个节点的父辈节点,顺序选择每个父辈节点前的所有同级节点
//meta[@name="ContentEnd"]/preceding::*   

两个方向的Xpath必有一个交集,交集部分即想要提取的内容。
jupyter notebook

剩下的就是Python基本功,切片或者其他方法,提取重复内容。
如果需要提取兄弟节点、子节点或者孙节点的情况,更换轴方法即可。
此思路费时费力,适合以结果为导向的场景!!!


附:XPath 轴方法

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

猜你喜欢

转载自blog.csdn.net/qq_44491709/article/details/108002960
今日推荐