【问题标题】:python3 lxml How to get attribute value by name of attribute after XPathpython3 lxml如何通过XPath之后的属性名称获取属性值
【发布时间】:2020-06-14 21:53:05
【问题描述】:

当使用 xpath 方法时,我如何获得属性 ID 的值(在下面的示例中应该是“DEF”),它是我的 XPath 结果的子项?

from lxml import etree
from io import StringIO
f = StringIO('<root><row id="DEF">ABC</row></root>')
doc = etree.parse(f)
for c in doc.xpath("/root/row"):
       print (c.tag)
       #print (c.attribute('id').value)
       print (c.value)  #shows ABC  

【问题讨论】:

    标签: python-3.x lxml


    【解决方案1】:

    基于Retrieve attribute names and values with Python / lxml and XPath。它说 attrib 将返回一个属性字典,然后我们可以在字典中进行查找:

       print (c.attrib['id'])
    

    我正在使用 PyCharm,但它并没有给我所有的自动完成选项。

    【讨论】:

      【解决方案2】:

      试试这个:

      for c in doc.xpath("/root/row/@id"):
           print(c)
      

      你的输出应该是DEF

      【讨论】:

      • 当然,这适用于这种非常具体的情况,但你改变了问题。我想使用我在问题中指定的 XPath,因为我的真实案例还有其他属性,我将在循环时检查这些属性。我认为我找到的答案符合我的要求。
      • @NealWalters 不确定我理解;也许我们使用了不同的术语:您是说每个&lt;row&gt; 都有一个属性,属性名称(id,在您的问题中)是未知的,并且您想选择属性值(DEF 在您的问题)?还是别的什么?
      • 我是说我在现实世界中的例子更像这样:ABC row> (当然是多行)。我需要按名称检索每个属性。所以计划在元素“行”上做 XPath,然后按名称打印或对每个属性做一些事情。
      • @NealWalters 我现在看到了。您可以通过将表达式更改为/root//row/@* 来获取所有属性值(在您的示例中为DEFHIJ 等)。但是要获取所有属性名称(在您的示例中为idattr2 等)或名称和值,仅使用xpath 您需要xpath 2.0 及更高版本,而lxml 仅支持1.0。所以我想我可以删除答案。
      • 您的回答可能会帮助其他人。谢谢
      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      相关资源
      最近更新 更多