gpt4 book ai didi

python - 使用 findall 、 Lxml 迭代 Xml

转载 作者:行者123 更新时间:2023-11-30 23:18:33 25 4
gpt4 key购买 nike

我有以下 xml:

<head>
<body>
<para>
<Run>
<Runprop>
<highlight val="red"/>
<break/>
<text>
Hello there
</text>
</RunProp>
</Run>
<Run>
<break/>
</Run>
<Run>
<text>
See you there
</text>
</Run>
</para> ..
</body>
</head>

我想提取所有带有highlight“红色”值的文本。请注意,highlight 标记比文本标记低一级。条件是:

  1. 为每个段落添加一个额外的空格。
  2. 如果在迭代 highlight 标记的父级时遇到中断标记,请添加一个空格。
  3. 仅提取与highlight标记相对应的文本

我所做的是:

text=""                                #initialize an empty string
for p in lxml_tree.findall('para'): #itertate over each paragraph (all paragarpahs have the same tag name para)
for r in p.findall("Run"): #iterate over each run
for a in r.iter(tag="highlight"): #search for highlight tag
for b in a.iterancestors(): #go back to the parents
if b.tag=="break": #if break found
text+=" " # add a space
elif b.tag=="text": # if text found
text+=''.join(b.text) #add text

上面的代码似乎不起作用,因为 iterancestors 一直走到根节点。我怎么可能迭代父级,即 Runpropbreaktext?我已经为所有文本实现了类似的东西并且有效..

编辑 1:
只是上面的逻辑有缺陷,我宁愿迭代段落中的每个 Run,先搜索 break,然后查看 Runprop 中是否有突出显示> 然后提取父级兄弟中的文本。

最佳答案

经过一番思考并从 anzel 的回答中得到一个想法后,我设法解决了这个问题。

text=""          
for p in lxml_tree.findall('para'): #iterate over paragraphs
text+= " " #add spaces
for r in p.findall("Run"): #iterate over each run in para
for a in r.findall("break"): #search for break tag in it and add space if found
text+= " "
for b in r.findall('.//highlight[@val="red"]/../..//text'): #search for red highlight in that run and return text
text+=''.join(b.text) # append text to main string

关于python - 使用 findall 、 Lxml 迭代 Xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26650142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com