需要选择性地转义HTML实体(&)
我正在抓取一个网页,然后用 xml.dom.minidom.parseString() 来创建一个 DOM 对象。
不过,这个网页里有一个 '&'。我可以用 cgi.escape 把它转换成 &
,但这样做会把我所有的 HTML 标签 <
和 >
也变成 <>
,这让 parseString() 不高兴。
我该怎么处理这个问题呢?我不想简单粗暴地直接替换掉所有的 "&"。
谢谢!
4 个回答
0
如果你想确保不会不小心把已经转义过的 &
再次转义(也就是说,不把 &
变成 &amp;
,或者把 ß
变成 &szlig;
),你可以这样做:
import re
newstring = re.sub(r"&(?![A-Za-z])", "&", oldstring)
这样做的话,当 &
后面跟着一个字母时,它就不会被改变了。
1
我不想只是简单地处理一下,直接把"&"替换掉。
呃,为什么呢?这就是cgi.escape
在做的事情——实际上就是对一些必须转义的特定字符进行搜索和替换。
如果你只想替换一个字符,那就直接替换那个字符:
yourstring.replace('&', '&')
别拐弯抹角的。
1
如果你想抓取网页内容,建议使用一些能处理混乱HTML的库,比如lxml。这个库有一个专门的HTML解析器,还有一个专门处理HTML的包lxml.html。另外,你也可以试试BeautifulSoup。这些库不仅能处理格式不规范的文档,还能提供其他功能,让抓取和处理HTML变得更简单,比如从表单中提取信息、将链接变成绝对路径、使用CSS选择器等等。