我发现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被转义?或者在输出之前如何解除它?
答案 0 :(得分:2)
编辑:此错误已在2013年5月30日发布的4.2.0中修复。
>>> import bs4
>>> bs4.__version__
'4.2.0'
>> 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>
... """
>>> soup = bs4.BeautifulSoup(s)
>>> print soup
<html><body><doctype html="">
<h1>Test page</h1>
<script type="text/javascript">
//<!--
if (4 > 3 && 3 < 4) {
console.log("js working");
}
//-->
</script>
</doctype></body></html>
如果你被困使用&lt; 4.2出于某种原因,我发现了这个StackOverflow answer。在我看来,你可以做类似的事情:在所有标签上使用prettyify()
走树,除了你以某种方式发出的script
标签而不转义。