我是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)
非常感谢您!