gpt4 book ai didi

python - 如何在 python 和 lxml 中找到具有某个值的标签

转载 作者:行者123 更新时间:2023-11-28 23:01:23 26 4
gpt4 key购买 nike

我有一个具有以下结构的 xml 文件:

<main_tag>
<first>
<tag1>val1</tag1>
<conf>
<tag2>val2</tag2>
<tag3>val3</tag3>
<tag4>val4</tag4>
</conf>
</first>
<second>
<tag1>val2</tag1>
<conf>
<tag2>val6</tag2>
<tag3>val7</tag3>
<tag4>val8</tag4>
</conf>
</second>
</main_tag>

我必须更改 tag2 的值。可能的值存储在字典中:

{tag2values:[newvalue1, newvalue2]}

如果 tag1 的值为 val1,则我们将 tag2 的值更改为 newvalue1。如果 tag1 值为 val2,则我们将 tag2 值更改为 newvalue2。

所以问题是:有没有办法在 lxml 中找到与其父值匹配的元素?或者通过元素的父邻居值查找元素?

最佳答案

.xpath method让我们通过 XPath 1.0 表达式查找标签:

>>> from lxml import etree
>>> from cStringIO import StringIO
>>> tag2values = ['newvalue1', 'newvalue2']
>>> example = StringIO("""\
... <main_tag>
... <first>
... <tag1>val1</tag1>
... <conf>
... <tag2>val2</tag2>
... <tag3>val3</tag3>
... <tag4>val4</tag4>
... </conf>
... </first>
... <second>
... <tag1>val2</tag1>
... <conf>
... <tag2>val6</tag2>
... <tag3>val7</tag3>
... <tag4>val8</tag4>
... </conf>
... </second>
... </main_tag>
... """)
>>> tree = etree.parse(example)
>>> value1selector = '*/conf/tag2[../../tag1/text() = "val1"]'
>>> value2selector = '*/conf/tag2[../../tag1/text() = "val2"]'
>>> for elem in tree.xpath(value1selector):
... elem.text = tag2values[0]
...
>>> for elem in tree.xpath(value2selector):
... elem.text = tag2values[1]
...
>>> print(etree.tostring(tree, pretty_print=True))
<main_tag>
<first>
<tag1>val1</tag1>
<conf>
<tag2>newvalue1</tag2>
<tag3>val3</tag3>
<tag4>val4</tag4>
</conf>
</first>
<second>
<tag1>val2</tag1>
<conf>
<tag2>newvalue2</tag2>
<tag3>val7</tag3>
<tag4>val8</tag4>
</conf>
</second>
</main_tag>

在上面的示例中,value1selector 中的 XPath 表达式为您提供了所有 tag2 元素,这些元素是 conf 的子元素,具有同级 tag1 标记带有文本 val1,作为 ElementTree Element 实例,因此可以轻松替换其文本内容。

关于python - 如何在 python 和 lxml 中找到具有某个值的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11061823/

26 4 0