如何在Python中将'&'替换为'&'?

2 投票
4 回答
18792 浏览
提问于 2025-04-18 10:14

我在使用 .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) ...]

撰写回答