python xpath:比较日期
我有一个简化的xml,其中包含许多python xpath:比较日期,python,xpath,lxml,xml.etree,Python,Xpath,Lxml,Xml.etree,我有一个简化的xml,其中包含许多a元素: <root> <A class="a" version="7"> <details> <dates> <status date="2013-04-29T04:16:49.792-04:00">ACCEPTED</status> <status date="2013-08-12T
a
元素:
<root>
<A class="a" version="7">
<details>
<dates>
<status date="2013-04-29T04:16:49.792-04:00">ACCEPTED</status>
<status date="2013-08-12T04:08:23.773-04:00">ACCEPTED</status>
</dates>
</details>
</A>
<A class="a" version="7">
...
</root>
但是这个代码的问题是,由于某种原因,比较结果总是返回false,因此res
总是空的
任何帮助或建议都将不胜感激 xpath 1.0中没有日期类型,您无法将xpath 1.0中的字符串与
=
和以外的运算符进行比较=代码>。您有一个包支持python中XPath2的一部分,但我从未尝试过(请参阅)。这可能是一条路要走 您可以使用datutil.parser
:
from lxml import etree
from datetime import datetime
from dateutil.parser import parse
a = '''<root>
<A class="a" version="7">
<details>
<dates>
<status date="2013-04-29T04:16:49.792-04:00">ACCEPTED</status>
<status date="2013-08-12T04:08:23.773-04:00">ACCEPTED</status>
</dates>
</details>
</A>
<A class="b" version="8">
<details>
<dates>
<status date="2012-04-29T04:16:49.792-04:00">ACCEPTED</status>
<status date="2012-08-12T04:08:23.773-04:00">ACCEPTED</status>
</dates>
</details>
</A>
</root> '''
tree = etree.fromstring(a)
# Set your begin time
beginTime = parse('2013-08-12T00:00:0.000-04:00')
# Loop through all A elements
for A in tree.findall('A'):
# Get the last time of the A element
timeA = A.find('./details/dates/status[last()]')
# Parse the found date into a datetime element
date = parse(timeA.get('date'))
# Compare the beginTime with the found date
if beginTime < date:
# Do as you like
#print(date)
从lxml导入etree
从日期时间导入日期时间
从dateutil.parser导入解析
a='''
认可的
认可的
认可的
认可的
'''
tree=etree.fromstring(a)
#设定开始时间
beginTime=parse('2013-08-12T00:00:0.000-04:00')
#循环遍历所有元素
对于树中的A.findall('A'):
#获取元素的最后时间
timeA=A.find(“./details/dates/status[last()]”)
#将找到的日期解析为datetime元素
date=parse(timeA.get('date'))
#将开始时间与找到的日期进行比较
如果开始时间<日期:
#随你的便
#打印(日期)
您需要翻译和比较数字:
In [24]: x = """<root>
....: <A class="a" version="7">
....: <details>
....: <dates>
....: <status date="2013-04-29T04:16:49.792-04:00">ACCEPTED</status>
....: <status date="2013-08-12T04:08:23.773-04:00">ACCEPTED</status>
....: </dates>
....: </details>
....: </A>
....: <A class="a" version="7">
....: </root>"""
In [25]: from lxml import html
In [26]: xml = html.fromstring(x)
In [27]: print(xml.xpath("a[translate(./details/dates/status[last()]/@date,'-:T.','') > '201308120000000000400']"))
[<Element a at 0x7fdb45bc8aa0>]
[24]中的:x=“”
....:
....:
....:
……接受
……接受
....:
....:
....:
....:
....: """
在[25]:从lxml导入html
在[26]中:xml=html.fromstring(x)
在[27]:print(xml.xpath(“a[translate(./details/dates/status[last()]/@date,'-:T.,'')>'2013081200000000000400']))
[]
一旦您总是比较具有相同偏移量的日期,并且您的日期的位数与iso8601格式的日期和yyyy-mm-dd格式的日期相同,则可以进行比较,这样比较就安全了,如果偏移量或位数不同,则必须作为datetime对象进行比较。我担心这不会像预期的那样起作用,因为xpath/lxml(ass浮点)中的数字表示形式不正确。这将是2.01308120408e+20。
因此它需要比时间更复杂的xapth(例如,在(…,'T')之前比较日期子字符串。
谢谢,但这是一种缓慢的方法
In [24]: x = """<root>
....: <A class="a" version="7">
....: <details>
....: <dates>
....: <status date="2013-04-29T04:16:49.792-04:00">ACCEPTED</status>
....: <status date="2013-08-12T04:08:23.773-04:00">ACCEPTED</status>
....: </dates>
....: </details>
....: </A>
....: <A class="a" version="7">
....: </root>"""
In [25]: from lxml import html
In [26]: xml = html.fromstring(x)
In [27]: print(xml.xpath("a[translate(./details/dates/status[last()]/@date,'-:T.','') > '201308120000000000400']"))
[<Element a at 0x7fdb45bc8aa0>]