用Python转义XML中的未转义字符

2024-05-16 05:37:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在一个大约5000行长的无效XML文件中转义特殊字符。下面是我必须处理的XML示例:

<root>
 <element>
  <name>name & surname</name>
  <mail>name@name.org</mail>
 </element>
</root>

这里的问题是名称中的字符“&;”。如何使用Python库转义像这样的特殊字符?我找不到一个方法来处理BeautifulSoup


Tags: 文件方法nameorg名称示例mailroot
3条回答
<name>name & surname</name>

不是格式良好的XML。应该是:

<name>name &amp; surname</name>

所有一致的XML工具都应该创建这个——您通常不必担心。如果创建一个带有“&;字符”的字符串,则XML工具将输出转义版本。如果您手工创建字符串,您的责任是确保它被转义。如果您使用XML编辑器,它应该为您转义。

如果文件是别人给你的,把它寄回去告诉他们它格式不好。如果它们不再存在,则必须使用纯文本编辑器。那是脆弱和混乱,但没有其他办法。如果文件的其他地方有用于转义的与号,则该文件是垃圾文件。

看一个10岁的帖子here和一个后来的帖子here

如果不关心xml中的无效字符,可以使用xml解析器的recover选项(请参见Parsing broken XML with lxml.etree.iterparse):

from lxml import etree

parser = etree.XMLParser(recover=True) # recover from bad characters.
root = etree.fromstring(broken_xml, parser=parser)
print etree.tostring(root)

输出

<root>
<element>
<name>name  surname</name>
<mail>name@name.org</mail>
</element>
</root>

您可能只是想在将HTML放入BeautifulSoup之前对其进行一些简单的regexp操作。

更简单的是,如果代码中没有任何SGML实体(&...;),那么html=html.replace('&','&amp;')将起到作用。

否则,请尝试:

x ="<html><h1>Fish & Chips & Gravy</h1><p>Fish &amp; Chips &#x0026; Gravy</p>"
import re
q=re.sub(r'&([^a-zA-Z#])',r'&amp;\1',x)
print q

实际上,regex查找的是&,后面不是字母数字或字符。它不会处理行尾的和号,但这可能是可以解决的。

相关问题 更多 >