需要选择性地转义HTML实体(&)

1 投票
4 回答
651 浏览
提问于 2025-04-16 02:17

我正在抓取一个网页,然后用 xml.dom.minidom.parseString() 来创建一个 DOM 对象。

不过,这个网页里有一个 '&'。我可以用 cgi.escape 把它转换成 &amp;,但这样做会把我所有的 HTML 标签 <> 也变成 &lt;&gt;,这让 parseString() 不高兴。

我该怎么处理这个问题呢?我不想简单粗暴地直接替换掉所有的 "&"。

谢谢!

4 个回答

0

如果你想确保不会不小心把已经转义过的 & 再次转义(也就是说,不把 &amp; 变成 &amp;amp;,或者把 &szlig; 变成 &amp;szlig;),你可以这样做:

import re
newstring = re.sub(r"&(?![A-Za-z])", "&amp;", oldstring)

这样做的话,当 & 后面跟着一个字母时,它就不会被改变了。

1

我不想只是简单地处理一下,直接把"&"替换掉。

呃,为什么呢?这就是cgi.escape在做的事情——实际上就是对一些必须转义的特定字符进行搜索和替换。

如果你只想替换一个字符,那就直接替换那个字符:

yourstring.replace('&', '&amp;')

别拐弯抹角的。

1

如果你想抓取网页内容,建议使用一些能处理混乱HTML的库,比如lxml。这个库有一个专门的HTML解析器,还有一个专门处理HTML的包lxml.html。另外,你也可以试试BeautifulSoup。这些库不仅能处理格式不规范的文档,还能提供其他功能,让抓取和处理HTML变得更简单,比如从表单中提取信息、将链接变成绝对路径、使用CSS选择器等等。

撰写回答