我有一个来自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>
节点,即使它在外面。
有人可以帮助我理解为什么吗?
答案 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