2014-10-01 120 views
1

我正在提取關於標籤的文本,我需要以列表形式將它們以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完美地工作。
我認爲有一些中間路徑丟失。

回答

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})] 
+0

和我應該用什麼文字? t.text似乎不起作用。 – 2014-10-01 10:38:54

+0

@Swordy:你確定這些'ins'元素中直接包含文本嗎? – 2014-10-01 10:47:22

+0

@MartijnPieters不,沒有。很可能這是OOXML的一種方言,其中的文本在'w:ins/w:r/w:t'裏面。所以'w:ins // text()'可以正常工作。 +1。 – 2014-10-02 22:10:04