[思路]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必有一个交集,交集部分即想要提取的内容。
剩下的就是Python基本功,切片或者其他方法,提取重复内容。
如果需要提取兄弟节点、子节点或者孙节点的情况,更换轴方法即可。
此思路费时费力,适合以结果为导向的场景!!!
附:XPath 轴方法
轴名称 | 结果 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等)。 |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
attribute | 选取当前节点的所有属性。 |
child | 选取当前节点的所有子元素。 |
descendant | 选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following | 选取文档中当前节点的结束标签之后的所有节点。 |
namespace | 选取当前节点的所有命名空间节点。 |
parent | 选取当前节点的父节点。 |
preceding | 选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling | 选取当前节点之前的所有同级节点。 |
self | 选取当前节点。 |
[思路]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必有一个交集,交集部分即想要提取的内容。
剩下的就是Python基本功,切片或者其他方法,提取重复内容。
如果需要提取兄弟节点、子节点或者孙节点的情况,更换轴方法即可。
此思路费时费力,适合以结果为导向的场景!!!
附:XPath 轴方法
轴名称 | 结果 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等)。 |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
attribute | 选取当前节点的所有属性。 |
child | 选取当前节点的所有子元素。 |
descendant | 选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following | 选取文档中当前节点的结束标签之后的所有节点。 |
namespace | 选取当前节点的所有命名空间节点。 |
parent | 选取当前节点的父节点。 |
preceding | 选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling | 选取当前节点之前的所有同级节点。 |
self | 选取当前节点。 |
发布评论