获取包含特定文本的所有节点(文本和属性)的有效方法

我的目标是检索包含特定文本的所有节点。

1-我可以按照以下请求检索包含一些文本的节点:

[node for node in root.xpath('//*[contains(.,"Carte de chaleur")]') ]


Out[62]: 
[<Element workbook at 0x1818bc76e88>,<Element worksheets at 0x1819b886dc8>,<Element worksheet at 0x1819c156488>,<Element layout-options at 0x1819c1564c8>,<Element title at 0x1818e9509c8>,<Element formatted-text at 0x1819c156c48>,<Element run at 0x1818e955048>,<Element worksheet at 0x1819c156a88>,<Element layout-options at 0x1819c156fc8>,<Element title at 0x1818e9508c8>,<Element formatted-text at 0x1819c1565c8>,<Element run at 0x1818e955088>]

但是当我检查时,我只得到2个包含特定文本的元素。

[node for node in root.xpath('//*[contains(.,"Carte de chaleur")]') if node.text.__contains__("Carte de chaleur")]
Out[66]: [<Element run at 0x1818e955048>,<Element run at 0x1818e955088>]

事实上,当我寻找这些运行节点之一的路径时,我发现所有的“工作簿”,“工作表”等实际上都是其父节点。

run_node
Out[71]: <Element run at 0x1818e955048>
tree.getpath(run_node)
Out[72]: '/workbook/worksheets/worksheet[3]/layout-options/title/formatted-text/run[1]'

那么为什么这个xpath查询返回我正在寻找的节点的所有父节点(实际上只是2个运行节点)?

2-如果我希望其属性包含特定文本的节点运行此查询:

root.xpath('//@*[contains(.,"bold")]/..')
Out[86]: 
[<Element format at 0x18199f56948>,<Element format at 0x18199f56148>]

(这是逻辑,因为我希望包含特定属性节点的节点,所以我正在寻找该属性节点的父级)

很奇怪,此请求不会产生相同的结果:

root.xpath('//*[contains(@*,"bold")]') 

即使对我来说,这最后一个意思是:“取根的任何后代元素,其任何属性都包含文本“ bold”(对我来说是相同的)

3-我可以使用变量检索属性包含不同值的节点吗?

对于一个变量,我可以做:

root('//*[@name=$var]',var="[Petal_length]") 

但是有没有办法做类似的事情:

root('//*[@name=$var1]//title[@format=$var2]',var1="[Petal_length]",var2="bold") 

编辑:这是原始文本https://ctxt.io/2/AACATwNVFA。 附言:如果某人知道一种分享文本多于1天的方式,对我有帮助。

yifeichongtian1234 回答:获取包含特定文本的所有节点(文本和属性)的有效方法

节点的字符串值是其中包含的所有文本节点的串联,因此,如果一个节点在其字符串值中包含特定的子字符串,则其所有祖先也将这样做。

您遇到的一个问题是您要为输入返回什么

<para>Carte <i>de</i> chaleur</para>

您是否要返回para元素?

如果您很高兴不返回此文本,那么您实际上是在说必须在单个文本节点中找到所有文本,因此您可以这样做

//*[text()[contains(.,"Carte de chaleur")]]

如果您确实希望返回para,那么您的要求是“查找包含文本的最底层元素,而不包括其祖先”,那么您可能必须做类似的事情

//*[contains(.,"Carte de chaleur") and not(*[contains(.,"Carte de chaleur")])]

我什至没有开始考虑效率...

本文链接:https://www.f2er.com/3152984.html

大家都在问