如何从一个代码中的两个相似标签中提取元素?
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]
我正在尝试从多个 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]