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



我正试图从多个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]

它不起作用。没有错误消息,但没有输出。任何建议都将不胜感激。非常感谢。

ElementTree中对xpath的支持非常有限。并集运算符(|(似乎不起作用,并且不支持其他选项,如在谓词中使用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关键字arg(。。。

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

最新更新