2024-05-16 05:37:00 发布
网友
我需要在一个大约5000行长的无效XML文件中转义特殊字符。下面是我必须处理的XML示例:
<root> <element> <name>name & surname</name> <mail>name@name.org</mail> </element> </root>
这里的问题是名称中的字符“&;”。如何使用Python库转义像这样的特殊字符?我找不到一个方法来处理BeautifulSoup。
<name>name & surname</name>
不是格式良好的XML。应该是:
<name>name & surname</name>
所有一致的XML工具都应该创建这个——您通常不必担心。如果创建一个带有“&;字符”的字符串,则XML工具将输出转义版本。如果您手工创建字符串,您的责任是确保它被转义。如果您使用XML编辑器,它应该为您转义。
如果文件是别人给你的,把它寄回去告诉他们它格式不好。如果它们不再存在,则必须使用纯文本编辑器。那是脆弱和混乱,但没有其他办法。如果文件的其他地方有用于转义的与号,则该文件是垃圾文件。
看一个10岁的帖子here和一个后来的帖子here。
如果不关心xml中的无效字符,可以使用xml解析器的recover选项(请参见Parsing broken XML with lxml.etree.iterparse):
recover
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('&','&')将起到作用。
&...;
html=html.replace('&','&')
否则,请尝试:
x ="<html><h1>Fish & Chips & Gravy</h1><p>Fish & Chips & Gravy</p>" import re q=re.sub(r'&([^a-zA-Z#])',r'&\1',x) print q
实际上,regex查找的是&,后面不是字母数字或字符。它不会处理行尾的和号,但这可能是可以解决的。
&
不是格式良好的XML。应该是:
所有一致的XML工具都应该创建这个——您通常不必担心。如果创建一个带有“&;字符”的字符串,则XML工具将输出转义版本。如果您手工创建字符串,您的责任是确保它被转义。如果您使用XML编辑器,它应该为您转义。
如果文件是别人给你的,把它寄回去告诉他们它格式不好。如果它们不再存在,则必须使用纯文本编辑器。那是脆弱和混乱,但没有其他办法。如果文件的其他地方有用于转义的与号,则该文件是垃圾文件。
看一个10岁的帖子here和一个后来的帖子here。
如果不关心xml中的无效字符,可以使用xml解析器的
recover
选项(请参见Parsing broken XML with lxml.etree.iterparse):输出
您可能只是想在将HTML放入BeautifulSoup之前对其进行一些简单的regexp操作。
更简单的是,如果代码中没有任何SGML实体(
&...;
),那么html=html.replace('&','&')
将起到作用。否则,请尝试:
实际上,regex查找的是
&
,后面不是字母数字或字符。它不会处理行尾的和号,但这可能是可以解决的。相关问题 更多 >
编程相关推荐