寻找相当于xpath,Lxml
问题描述:
我正在提取关于标签的文本,我需要以列表形式将它们以w.r.t p标签的形式提取出来。我有这样的XPath表达式为:寻找相当于xpath,Lxml
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完美地工作。
我认为有一些中间路径丢失。
答
你不能在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似乎不起作用。 – 2014-10-01 10:38:54
@Swordy:你确定这些'ins'元素中直接包含文本吗? – 2014-10-01 10:47:22
@MartijnPieters不,没有。很可能这是OOXML的一种方言,其中的文本在'w:ins/w:r/w:t'里面。所以'w:ins // text()'可以正常工作。 +1。 – 2014-10-02 22:10:04