Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python xpath:比较日期_Python_Xpath_Lxml_Xml.etree - Fatal编程技术网

python xpath:比较日期

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

我有一个简化的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-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>]