Findall相当于xpath,Lxml

时间:2014-10-01 10:27:53

标签: python xml xpath lxml findall

我正在提取关于标签的文本,我需要以列表形式获取它们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完美地工作 我认为缺少一些中间路径。

1 个答案:

答案 0 :(得分:4)

您不能将该表达用于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})]