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