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 ">" (\>
)
问题是正则表达式总是会返回最多的子序列。所以我们要保证“”之间不会有任何其他标签。【参考方案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标签的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:在使用 html_strip 过滤器不工作的索引文档之前去除 HTML 标签