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

标签 python xml lxml

我有一个具有以下结构的 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 表达式为您提供了作为 conf 子级的所有 tag2 元素,以及同级 >tag1 标签带有文本 val1,作为 ElementTree Element 实例,因此可以轻松替换其文本内容。

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

相关文章:

python - 如何将标记文本从简单字符串添加到元素?

Python:根据第一个元素对数组中的元组进行排序

java - Android:更改一个 fragment 的应用栏高度并删除文本

java - @Qualifier() 和 @Autowired() 不起作用

python - 在Python中设置元素树中的Bool

python - 迭代解析 HTML(使用 lxml?)

python - 如何获取数据框中的累计行数?

python - 如何将 Pandas 时区感知时间戳转换为 UNIX 纪元?

python - 强制 pylint 分数 merge 到 github 分支上

python - 将 XML 提取到以父属性作为列标题的数据框中