【发布时间】:2013-04-03 11:41:49
【问题描述】:
我发现 BeautifulSoup 4 似乎转义了内联 javascript 中的某些字符:
>>> print s
<DOCTYPE html>
<html>
<body>
<h1>Test page</h1>
<script type="text/javascript">
//<!--
if (4 > 3 && 3 < 4) {
console.log("js working");
}
//-->
</script>
</body>
</html>
>>> import bs4
>>> soup = bs4.BeautifulSoup(s, 'html5lib')
>>> print soup
<html><head></head><body><doctype html="">
<h1>Test page</h1>
<script type="text/javascript">
//<!--
if (4 > 3 && 3 < 4) {
console.log("js working");
}
//-->
</script>
</doctype></body></html>
>>> print soup.prettify()
<html>
<head>
</head>
<body>
<doctype html="">
<h1>
Test page
</h1>
<script type="text/javascript">
//<!--
if (4 > 3 && 3 < 4) {
console.log("js working");
}
//-->
</script>
</doctype>
</body>
</html>
万一在上面丢失了,关键问题是:
if (4 > 3 && 3 < 4)
转换成:
if (4 > 3 && 3 < 4)
效果不是特别好……
我尝试了prettify() 方法中包含的格式化程序,但没有成功。
那么知道如何阻止 javascript 被转义吗?或者如何在输出前取消转义?
【问题讨论】:
-
请注意,它应该是
<!-- //,而不是// <!--。但对输出没有影响。 -
<!-- -->cmets 在 Javascript 中实际上是无用的,因为 Javascript 可以很好地利用<、&和>字符。您真的应该使用<![CDATA[和]]>来正确“转义”<script>标记的内容。 -
这是解析器的问题;它不会将内容视为评论,因此
<!--和-->前缀和后缀被转义。 -
@MartijnPieters - 无论我使用哪个版本的评论,或者如果我不使用评论,关键问题是
if语句内容被转义。我将更新问题以使其更清楚。
标签: python escaping beautifulsoup