python lxml xpath错误:使用'//'

时间:2019-12-29 22:10:42

标签: python xml xpath find lxml

我是lxml和XPath的新手。我正在尝试通过文本查找元素,但无法使其正常工作。我们非常感谢您的帮助。

编辑:我测试了不同的XML文件,其中一个具有1,262,297行有效,而另一个具有7,594,023行则无效。我是否遇到了XPath / lxml的某些固有限制?还是文件以某种方式损坏了?

xPath表达式:

for e in root.xpath('//d[text()="abc"]'):
   print(e.text)

错误:

  File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/myXMLprocessor.py", line 32, in func01
    for e in root.xpath('//d[text()="abc"]'):
  File "src/lxml/etree.pyx", line 1577, in lxml.etree._Element.xpath
  File "src/lxml/xpath.pxi", line 307, in lxml.etree.XPathElementEvaluator.__call__
  File "src/lxml/xpath.pxi", line 227, in lxml.etree._XPathEvaluatorBase._handle_result
lxml.etree.XPathEvalError: Invalid expression

我的xml文件是7594023行文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxx SYSTEM "http://xxx">
<a>
  <b>
    <c>
      <d foo="bar">abc</d>
    </c>
  </b>
  <b>
    ..etc..
  </b>
</a>

基本代码

from lxml import etree as ET 
import os
filename = os.fsdecode("my.xml")
tree = ET.parse(filename)
root = tree.getroot()
for e in root.xpath('//d[text()="abc"]'):
   print(e.text)

我实际上尝试了我能想到的上述内容的任何变体。然后我尝试了直接搜索,例如以下内容。那行得通。但是后来我在所有深度('//')处都替换了它,但是由于上面的错误而失败了。我在做什么错了?

直接搜索(有效):

for e in root.xpath('/a/b/c/d[text()="abc"]'):
   print(e.text)

任何深度的搜索(无效):

for e in root.xpath('//d[text()="abc"]'):
   print(e.text)

非常感谢您!

0 个答案:

没有答案