使用XPath

时间:2018-03-29 20:47:47

标签: python xpath

此问题的后续行动 - Xpath. How to select all text between two tags?

我可以从一个像这样的交叉点之间得到文本 -

response.xpath('//pre[preceding-sibling::a[@name="dst100030"] and following-sibling::a[@name="dst100031"]]//text()')

该页面有一个这样的交叉点列表,我需要从每个交叉点之间获取文本。是否有使用xpath的选项? enter image description here

或者我应该创建一个包含所有@name值的列表,并将它们替换为预先存在和跟随兄弟姐妹?

1 个答案:

答案 0 :(得分:0)

我不会想到"集合的交叉点"是一种表征这个问题的准确方法。我会将其描述为"对序列进行分区"。

你不能说你正在寻找什么样的结果,但从表面上看,它是一系列序列,并立即发出问题,即没有这样的事情作为XPath数据模型中的序列序列 - 至少在XPath 3.1之前,当引入数组时。

您不会说出您感兴趣的XPath版本,但是您已经标记了问题" Python"暗示它可能是XPath 1.0。如果是这样,那么我认为最好的解决方案几乎肯定是将整个输入序列拉入Python并在那里进行分区。

FWIW,在XPath 3.1中,您可以创建一个地图,将dst100003之类的关键字映射到紧跟相关pre元素的a元素:

map:merge(for $a in child::a 
          return map{$a!@name, 
            $a!following-sibling::pre[preceding-sibling::a[1] is $a]})

然而,它可能具有O(n ^ 2)性能,并且使用XQuery 3.1分组(或XSLT for-each-group)的解决方案几乎肯定会表现得更好。