3

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">
//&lt;!--
if (4 &gt; 3 &amp;&amp; 3 &lt; 4) {
        console.log("js working");
}
//--&gt;
</script>

</doctype></body></html>
>>> print soup.prettify()
<html>
 <head>
 </head>
 <body>
  <doctype html="">
   <h1>
    Test page
   </h1>
   <script type="text/javascript">
    //&lt;!--
if (4 &gt; 3 &amp;&amp; 3 &lt; 4) {
        console.log("js working");
}
//--&gt;
   </script>
  </doctype>
 </body>
</html>

上記で失われた場合、重要な問題は次のとおりです。

if (4 > 3 && 3 < 4)

に変換されます:

if (4 &gt; 3 &amp;&amp; 3 &lt; 4)

これは特にうまく機能しません...

メソッドに含まれているフォーマッターを試しましたが、prettify()成功しませんでした。

では、JavaScript のエスケープを停止する方法はありますか? または、出力する前にエスケープを解除する方法は?

4

1 に答える 1

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>

何らかの理由で < 4.2 を使用している場合は、この StackOverflow answerを見つけました。似たようなことができるように思えます:エスケープせずに何らかの方法で発行するprettyify()タグを除くすべてのタグを使用して、ツリーを歩きます。script

于 2013-05-09T21:25:49.497 に答える