如何从一个代码中的两个相似标签中提取元素?

How to extract element from two similar tags in one code?

我正在尝试从多个 xml 文件中提取年份。最初,xml 个文件如下,

<Return xmlns="http://www.irs.gov/efile" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.irs.gov/efile" returnVersion="2018v3.2">
  <ReturnHeader binaryAttachmentCnt="0">
    <!-- ... -->
    <TaxPeriodEndDt>2019-09-30</TaxPeriodEndDt>
    <!-- ... -->
  </ReturnHeader>
  <ReturnData documentCnt="12">
    <!-- ... -->
  </ReturnData>
</Return>

我用过

year = root.find('.//irs:TaxPeriodEndDt',ns).text[:4]

效果很好。但在某些 xml 文件中,标签更改为 TaxPeriodEndDate

<Return xmlns="http://www.irs.gov/efile" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.irs.gov/efile" returnVersion="2018v3.2">
  <ReturnHeader binaryAttachmentCnt="0">
    <!-- ... -->
    <TaxPeriodEndDate>2012-09-30</TaxPeriodEndDate>
    <!-- ... -->
  </ReturnHeader>
  <ReturnData documentCnt="12">
    <!-- ... -->
  </ReturnData>
</Return>

我尝试将代码修改为

year = root.find('.//irs:TaxPeriodEndDt|.//irs:TaxPeriodEndDate',ns).text[:4]

没用。没有错误消息,但没有输出。非常感谢任何建议。谢谢。

xpath in ElementTree的支持非常有限。联合运算符 (|) 似乎不起作用,并且不支持其他选项,例如在谓词中使用 self:: 轴或 name()/local-name()

我认为最好的选择是使用 try/except...

try:
    year = root.find(".//irs:TaxPeriodEndDt", ns).text[:4]
except AttributeError:
    year = root.find(".//irs:TaxPeriodEndDate", ns).text[:4]

如果您可以切换到 lxml,您对联合运算符的最初尝试将进行一些小的更改(主要使用 xpath() 而不是 find() 并使用 namespaces 关键字参数)...

year = root.xpath(".//irs:TaxPeriodEndDt|.//irs:TaxPeriodEndDate", namespaces=ns)[0].text[:4]