如何通过XPath获取最新日期?
我有下面这个xml:
<Content>
<article title="I Compute, Therefore I am" id="a1">
<authors>
<author>Philbert von Cookie</author>
<author>Alice Brockman</author>
<author>Pedro Smith</author>
</authors>
<journal>
<name>Journal of Computational Metaphysics</name>
<volume>3</volume>
<issue>7</issue>
<published>04/11/2006</published>
<pages start="42" end="49"/>
</journal>
</article>
...
</Content>
在根元素content里面有很多类似的文章节点。
我已经把这个xml解析成了python代码,现在想要获取最大的日期值。以下是我的python代码:
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
tree = ET.ElementTree(file='data.xml')
root = tree.getroot()
root.tag, root.attrib
我试着用iterfind()来获取,但到现在为止都没有成功。
for elem in tree.iterfind('(/*/*/journal/published/value[not(text() < preceding-sibling::value/text()) and not(text() < following-sibling::value/text())])[1]'):
print (elem.text)
你能帮我一下吗?我该怎么设置iterfind()的XPATH,或者有没有其他方法可以做到这一点?谢谢你。
1 个回答
1
xml.etree.ElementTree
这个库只提供了有限的xpath支持。
一个替代的方法是把所有的日期解析到一个列表中,然后找出最大的那个日期:
from datetime import datetime
dates = [published.text for published in root.iterfind('.//article/journal/published')]
print max(dates, key=lambda x: datetime.strptime(x, '%d/%m/%Y'))
需要注意的是,在这种情况下,要找出最大值,你应该比较datetime
类型的值,而不是字符串(这就是key
函数派上用场的地方)。
另外,如果你想找到与最大日期对应的journal
记录,你可以构建一个字典,把“日期 -> journal”进行映射,然后就能找到相应的journal记录:
from datetime import datetime
import operator
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
tree = ET.ElementTree(file='data.xml')
root = tree.getroot()
mapping = {datetime.strptime(journal.findtext('published'), '%d/%m/%Y'): journal
for journal in root.iterfind('.//article/journal')}
journal_latest = max(mapping.iteritems(), key=operator.itemgetter(0))[1]
print journal_latest.findtext('name')