无法从python中的xml中提取文本

时间:2015-03-12 10:19:37

标签: python xml

我有一个来自doc的xml文件(MS Word 2003,所以我不能使用docx库)。我正在使用lxml来解析它。我可以获得大部分文本(一切都在<txt>个节点中)但是有一些节点具有以下结构:

<txt ptr="0x7f6354043000" id="3" symbol="8SwTxtFrm" next="4" upper="2" txtNodeIndex="9">
 <infos>
  <bounds left="1521" top="851" width="10517" height="322"/>
 </infos>
 The text I want to extract    <Special nLength="0" nType="POR_MARGIN" rText="" nWidth="2396"/>
 <Text nLength="1" nType="POR_TXT" nHeight="322" nWidth="78"/>
 <Text nLength="42" nType="POR_TXT" nHeight="322" nWidth="5647"/>
 <Special nLength="0" nType="POR_MARGIN" rText="" nWidth="2397"/>
 <LineBreak nWidth="10518"/>
 <Finish/>
</txt>

当我透过<txt>来提取文本部分时使用:

for txt in tree.iter('txt'):
    print(txt.text)

我意识到导致问题的是<infos>节点。我试图删除它:

for elt in tree.iter('txt'):
for info in elt.findall('infos'):
    elt.remove(info)

但是这会删除目标文本和<infos>节点,即使它在外面。

有人可以帮助我理解为什么吗?

2 个答案:

答案 0 :(得分:1)

根据我对原帖的评论,OP通过更改xpath解决了这个问题,如下所示

tree.xpath('//text()')

答案 1 :(得分:0)

您可以这样提取文字:

In [31]: txt = """<txt ptr="0x7f6354043000" id="3" symbol="8SwTxtFrm" next="4" upper="2" txtNodeIndex="9">
   ....:  <infos>
   ....:   <bounds left="1521" top="851" width="10517" height="322"/>
   ....:  </infos>
   ....:  The text I want to extract    <Special nLength="0" nType="POR_MARGIN" rText="" nWidth="2396"/>
   ....:  <Text nLength="1" nType="POR_TXT" nHeight="322" nWidth="78"/>
   ....:  <Text nLength="42" nType="POR_TXT" nHeight="322" nWidth="5647"/>
   ....:  <Special nLength="0" nType="POR_MARGIN" rText="" nWidth="2397"/>
   ....:  <LineBreak nWidth="10518"/>
   ....:  <Finish/>
   ....: </txt>"""

In [32]: node = etree.fromstring(txt)

In [33]: ''.join(node.itertext())
Out[33]: '\n \n  \n \n The text I want to extract    \n \n \n \n \n \n'

<强> UPD:

Murali建议的回答实际上会返回list,所以你仍然需要加入字符串。我的解决方案更快一点:

In [13]: %timeit ''.join(node.itertext())
100000 loops, best of 3: 11.7 µs per loop

In [14]: %timeit ''.join(node.xpath('//text()'))
10000 loops, best of 3: 26.3 µs per loop