我正在抓取一个 html 页面,然后使用 xml.dom.minidom.parseString() 创建一个 dom 对象。
但是,html 页面有一个“&”。我可以使用 cgi.escape 将其转换为&
,但它也会将我所有的 html <> 标签转换为<>
这使得 parseString() 不开心。
我该怎么做?我宁愿不只是破解它并直接替换“&”
谢谢
我正在抓取一个 html 页面,然后使用 xml.dom.minidom.parseString() 创建一个 dom 对象。
但是,html 页面有一个“&”。我可以使用 cgi.escape 将其转换为&
,但它也会将我所有的 html <> 标签转换为<>
这使得 parseString() 不开心。
我该怎么做?我宁愿不只是破解它并直接替换“&”
谢谢
我宁愿不只是破解它并直接替换“&”
呃,为什么?这就是cgi.escape
正在做的事情 - 实际上只是对必须转义的某些字符的搜索和替换操作。
如果只想替换单个字符,只需替换单个字符:
yourstring.replace('&', '&')
不要拐弯抹角。
对于抓取,请尝试使用可以处理此类 html“标签汤”的库,例如 lxml,它具有html 解析器(以及lxml.html中的专用 html 包)或BeautifulSoup(您也会发现这些库除了能够处理格式错误的文档之外,还包含其他使抓取/使用 html 更容易的东西:从表单中获取信息,使超链接成为绝对,使用 css 选择器......)
您不应该使用 XML 解析器来解析不是 XML 的数据。找一个 HTML 解析器,从长远来看,你会更快乐。标准库有几个(HTMLParser 和 htmllib),BeautifulSoup 是一个深受喜爱的第三方包。
如果你想确保你不会意外地重新转义一个已经转义的&
(即不转换&
成&amp;
或ß
成&szlig;
),你可以
import re
newstring = re.sub(r"&(?![A-Za-z])", "&", oldstring)
&
当它们后面跟着一个字母时,这将使s 不受影响。