Python从文档中去除XML标签

Posted

技术标签:

【中文标题】Python从文档中去除XML标签【英文标题】:Python strip XML tags from document 【发布时间】:2012-10-01 04:10:05 【问题描述】:

我正在尝试使用 Python 去除文档中的 XML 标记,Python 是一种我是新手的语言。这是我第一次尝试使用正则表达式,whixh 确实是一个最好的想法。

mfile = file("somefile.xml","w")

for line in mfile:
    re.sub('<./>',"",line) #trying to match elements between < and />

那惨遭失败。我想知道应该如何使用正则表达式。

其次,我google了一下,发现:http://code.activestate.com/recipes/440481-strips-xmlhtml-tags-from-string/

这似乎有效。但我想知道有没有更简单的方法来摆脱所有 xml 标签?也许使用 ElementTree?

【问题讨论】:

使用 "w" 选项打开文件将从一个空文件开始,并且您对其进行迭代是无用的。 最好的方法是使用解析器,例如BeautifulSoup。 this question 的第二个答案会有所帮助。 (您想使用 from BeautifulSoup import BeautifulStoneSoup 并在解析中使用 BeautifulStoneSoup)。 你不能用regex解析[X]HTML 要明确-您是要更改文档,还是将其写入新文档? @大卫罗宾逊。对于上面的例子,我试图改变它。然后我打算修改它以创建一个新文档 【参考方案1】:

不需要 lxml 外部库的耶利米答案的替代方案:

import xml.etree.ElementTree as ET
...
tree = ET.fromstring(Text)
notags = ET.tostring(tree, encoding='utf8', method='text')
print(notags)

应该适用于任何 Python >= 2.5

【讨论】:

它给出错误 AttributeError: 'ElementTree' object has no attribute 'itertext' @MajesticRa 这很奇怪,也许您可​​以尝试使用“文本”以外的其他方法?你可能在使用 Python3 吗?这可以解释这种变化,也许这个方法的名称发生了变化。【参考方案2】:

请注意,通常使用正则表达式是不正常的。见Jeremiah answer。

试试这个:

import re

text = re.sub('<[^<]+>', "", open("/path/to/file").read())
with open("/path/to/file", "w") as f:
    f.write(text)

【讨论】:

@JJG:请注意,在 for 循环之后您仍然需要一些东西(这不会自行更改文件 @David Robinson 谢谢我现在意识到了 我不确定我是否理解那里的正则表达式。它似乎与开始 之前不匹配另一个 @JJG, 1. char "\<),然后一个或多个字符不是"[^\<]+),还有char ">" (\&gt;) 问题是正则表达式总是会返回最多的子序列。所以我们要保证“”之间不会有任何其他标签。【参考方案3】:

最可靠的方法可能是使用LXML。

from lxml import etree
...
tree = etree.parse('somefile.xml')
notags = etree.tostring(tree, encoding='utf8', method='text')
print(notags)

它将避免使用正则表达式“解析”XML的问题,并且应该正确处理转义和所有事情。

【讨论】:

或者如果你知道字符串,而不是从文件中加载,你可以tree=etree.fromstring(xml_string),标签也以 bytes 结尾,所以你可能想做一个.decode('utf-8')得到一个 string.

以上是关于Python从文档中去除XML标签的主要内容,如果未能解决你的问题,请参考以下文章

Python读取文件去除html&xml标签格式

Java regex 去除 XML 标签,但不去除标签内容

Elasticsearch:在使用 html_strip 过滤器不工作的索引文档之前去除 HTML 标签

如何使用 robobrowser 从 html 中去除标签

BeautifulSoup get_text 不会去除所有标签和 JavaScript

python去除excel水印