如何在Python中将'&'替换为'&'?
我在使用 .replace()
的时候遇到了一些问题。我的 XML 解析器不喜欢 '&' 这个字符,但它可以接受 '&\amp;'。我想用 .replace('&','&')
来替换,但这似乎不管用。我一直收到这个错误:
lxml.etree.XMLSyntaxError: xmlParseEntityRef: no name, line 51, column 41
到目前为止,我尝试了直接用 file=file.replace('&','&')
来替换,但这也不行。我还尝试过:
xml_file = infile
file=xml_file.readlines()
for line in file:
for char in line:
char.replace('&','&')
infile=open('a','w')
file='\n'.join(file)
infile.write(file)
infile.close()
infile=open('a','r')
xml_file=infile
有什么好的办法来解决我的问题吗?
4 个回答
1
哦...
你需要把特殊符号的HTML表示法解码。Python有一个模块可以处理这个问题,叫做HTMLParser
,这里有一些文档。
下面是一个例子:
import HTMLParser
out_file = ....
file = xml_file.readlines()
parsed_lines = []
for line in file:
parsed_lines.append(htmlparser.unescape(line))
1
虽然这个话题有点偏,但使用一些转义字符可能会比较好。
我经常使用urllib库里的quote函数,它可以帮我们处理HTML中的转义字符。
result=urllib.quote("filename&fileextension")
'filename%26fileextension'
urllib.unquote(result)
filename&fileextension
这样做可能会让我们的代码更加一致。
2
str.replace()
方法会返回一个新的字符串对象,里面包含了你所做的修改。它不会直接在原来的字符串上进行更改。你忽略了这个返回值。
你应该把这个方法应用到每一行上:
file = [line.replace('&', '&') for line in file]
你可以使用 fileinput()
模块 来进行转换,这样它会处理替换原始文件(会自动备份一份):
import fileinput
import sys
for line in fileinput.input('filename', inplace=True):
sys.stdout.write(line.replace('&', '&'))
5
str.replace
是一个用来创建并返回新字符串的功能。它不能直接修改原来的字符串,因为字符串是不可变的。你可以试着替换:
file=xml_file.readlines()
用
file = [line.replace('&','&') for line in xml_file]
这个方法使用了列表推导式来生成一个和 .readlines()
返回的结果相同的列表,但已经进行了替换。
正如评论中提到的,如果字符串里已经有 &
,它们会变成 &
,这可能不是你想要的。为了避免这种情况,你可以在正则表达式中使用一种叫做 负向前瞻 的技巧,只替换那些后面没有跟着 amp;
的符号:
import re
file = [re.sub("&(?!amp;)", "&", line) ...]