我试图解析像xml一样的
<document>
<pages>
<page>
<paragraph>XBV</paragraph>
<paragraph>GHF</paragraph>
</page>
<page>
<paragraph>ash</paragraph>
<paragraph>lplp</paragraph>
</page>
</pages>
</document>
Run Code Online (Sandbox Code Playgroud)
这是我的代码
import xml.etree.ElementTree as ET
tree = ET.parse("../../xml/test.xml")
root = tree.getroot()
path="./pages/page/paragraph[text()='GHF']"
print root.findall(path)
Run Code Online (Sandbox Code Playgroud)
但我得到一个错误
print root.findall(path)
File "X:\Anaconda2\lib\xml\etree\ElementTree.py", line 390, in findall
return ElementPath.findall(self, path, namespaces)
File "X:\Anaconda2\lib\xml\etree\ElementPath.py", line 293, in findall
return list(iterfind(elem, path, namespaces))
File "X:\Anaconda2\lib\xml\etree\ElementPath.py", line 263, in iterfind
selector.append(ops[token[0]](next, token))
File "X:\Anaconda2\lib\xml\etree\ElementPath.py", line 224, in prepare_predicate
raise SyntaxError("invalid predicate")
SyntaxError: invalid predicate
Run Code Online (Sandbox Code Playgroud)
我的xpath有什么问题?
跟进
谢谢你,你的解决方案有效.我有一个跟进.现在,我想获得带有文本的段落之前的所有段落元素GHF.所以在这种情况下我只需要XBV元素.我想忽略ash和lplp.我想有一种方法可以做到这一点
result = []
for para in root.findall('./pages/page/'):
t = para.text.encode("utf-8", "ignore")
if t == "GHF":
break
else:
result.append(para)
Run Code Online (Sandbox Code Playgroud)
但是有更好的方法吗?
fal*_*tru 10
ElementTree的XPath支持有限.使用其他库,如lxml:
import lxml.etree
root = lxml.etree.parse('test.xml')
path="./pages/page/paragraph[text()='GHF']"
print root.xpath(path)
Run Code Online (Sandbox Code Playgroud)
正如@falsetru 提到的,ElementTree不支持text()谓词,但它支持按文本匹配子元素,因此在此示例中,可以使用 path搜索具有特定文本的pagea 。这里的问题是 a 中有多个标签,因此必须迭代特定的. 就我而言,我需要在 maven pom.xml 中找到a 的,并且只有一个孩子,因此以下工作:paragraph./pages/page[paragraph='GHF']paragraphpageparagraphversiondependencyversion
In [1]: import xml.etree.ElementTree as ET
In [2] ns = {"pom": "http://maven.apache.org/POM/4.0.0"}
In [3] print ET.parse("pom.xml").findall(".//pom:dependencies/pom:dependency[pom:artifactId='some-artifact-with-hardcoded-version']/pom:version", ns)[0].text
Out[1]: '1.2.3'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8869 次 |
| 最近记录: |