python - lxml findall 语法错误 : invalid predicate

标签 python xml xpath lxml

我正在尝试使用 xpath 查找 xml 中的元素。这是我的代码:

utf8_parser = etree.XMLParser(encoding='utf-8')
root = etree.fromstring(someString.encode('utf-8'), parser=utf8_parser)

somelist = root.findall("model/class[*/attributes/attribute/@name='var']/@name")

someString 中的 xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<model>    
<class name="B" kind="abstract">
    <inheritance>
        <from name="A" privacy="private" />
    </inheritance>
    <private>
        <methods>
            <method name="f" type="int" scope="instance">
                <from name="A" />
                <virtual pure="yes" />
                <arguments></arguments>
            </method>
        </methods>
    </private>
    <public>
        <attributes>
            <attribute name="var" type="int" scope="instance">
            </attribute>
        </attributes>
    </public>
</class>
</model>

当我使用 findall 时,我收到此错误:

raise SyntaxError("invalid predicate")
SyntaxError: invalid predicate

我尝试使用xpath而不是findall。该脚本运行没有错误,但 somelist 为空。我做错了什么?

最佳答案

xpath()切换到findall()并不是一个解决方案。后者仅支持 XPath 1.0 表达式的子集(与 xml.etree.ElementTreeXPath support 兼容),并且您尝试的表达式恰好是不支持的子集的一部分。

实际问题是,root 变量已经引用了 model 元素,因此您无需在中再次提及 "model"你的 XPath :

somelist = root.xpath("class[*/attributes/attribute/@name='var']/@name")

关于python - lxml findall 语法错误 : invalid predicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36674120/

相关文章:

iphone - 在 HTTP 响应中获取 XML 并读取它

python - Scrapy - 发送新请求/使用回调

xpath - 如何通过 Xpath 使用 Selenium 来确定元素的类?

python - Django 中的软件即服务 - 许多公司应该能够拥有相同的用户

python - 取消 python asyncio 中的嵌套协程

python - 使用 read_csv() 创建的 DataFrame 给出了意外的 query() 结果

python - 在 mac osx 上安装 python 模块 (qpid proton)

c# - 为什么我的 XmlReader.GetAttribute() 没有返回值?

java - 当首选项屏幕启动时,Android 应用程序立即崩溃

python - scrapy - 无法正确地将多个 URL 从 <p> 标签提取到项目列表中