【问题标题】:Findall equivalent for xpath , LxmlFindall 等价于 xpath , Lxml
【发布时间】:2014-10-01 10:27:52
【问题描述】:

我正在提取与标签相关的文本,我需要以列表形式获取它们 w.r.t p 标签。我有这个 xpath 表达式:

 find =  etree.XPath("//w:p//.//*[local-name() = 'ins']//text()" ,namespaces={'w':"http://schemas.openxmlformats.org/wordprocessingml/2006/main"}) 

我想在findall 表达式中使用它。我试过了:

inserted_list_1=[]
for p in lxml_tree.findall('.//{' + w + '}p'):
    inserted_list_1.append([t.text for t in p.findall('.//{' + w + '}ins')])

但是所有这些返回都是一个包含None 值的列表,而以前的 xpath 可以完美运行。
我认为缺少一些中间路径。

【问题讨论】:

    标签: python xml xpath lxml findall


    【解决方案1】:

    您不能将该表达式与findall() 一起使用; findall() 方法故意保持与limited ElementTree API XPath support 的兼容性。

    请改用xpath() method

    for p in lxml_tree.xpath('.//w:p', namespaces={'w': w}):
    

    并且只使用命名空间前缀来获得更易读的查询。

    如果你只是想提取所有包含的文本,你可以使用:

    [t for t in p.xpath('../w:p//w:ins//text()',namespaces={'w': w})]
    

    【讨论】:

    • 我应该使用什么文本? t.text 似乎不起作用。
    • @Swordy:你确定这些ins元素中直接包含文本吗?
    • @MartijnPieters 不,没有。这很可能是 OOXML 的一种方言,其中文本位于 w:ins/w:r/w:t 内。所以,w:ins//text() 工作正常。 +1。
    猜你喜欢
    • 2021-10-24
    • 2018-12-23
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2012-11-19
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多