jsoup parse()似乎删除了前导<script>元素

时间:2016-05-27 15:26:58

标签: jsoup

我的HTML可能包含来自Surveymonkey的嵌入代码,我想通过jSoup运行,以确保生成的HTML有效。 XSS在这里不是问题。这是一个示例HTML片段(编辑:在这种情况下JavaScript的内容是无关紧要的,所以我用一个简单的日志语句替换了Surveymonkey JS):

&#xA;&#xA;
 &lt; script type =“text / javascript”&gt; console.log('foo');&lt; / script&gt;&#xA;&lt; div id =“somecontent”&gt;一些内容&lt; / div&gt;&#xA ;&lt; script type =“text / javascript”&gt; console.log('bar');&lt; / script&gt;&#xA;  
&#xA;&#xA;

parse(htmlSnippet).body()。html()会产生一个缺少第一个脚本 -block的字符串:

&#xA;&# xA;
 &lt; div id =“somecontent”&gt;一些内容&lt; / div&gt; &#xA;&lt; script type =“text / javascript”&gt; console.log('bar');&lt; / script&gt;&#xA;  
&#xA;&#xA;

然而,第二个脚本 -block没有被剥离。

&#xA;&#xA;

如果我用一个空的&lt;前缀整个东西。 span&gt;&lt; / span&gt; ,jSoup保留脚本。因此,对于以下代码段

&#xA;&#xA;
 &lt; span&gt;&lt; / span&gt;&#xA;&lt; script type =“text / javascript”&gt;控制台。 log('foo');&lt; / script&gt;&#xA;&lt; div id =“somecontent”&gt;一些内容&lt; / div&gt;&#xA;&lt; script type =“text / javascript”&gt;控制台。日志( '巴');&LT; /脚本&GT;&#XA;  
&#XA;&#XA;

<代码>解析(htmlSnippet)。体()的HTML() 返回

&#xA;&#xA;
 &lt; span&gt;&lt; / span&gt; &#xA;&lt; script type =“text / javascript”&gt; console.log('foo');&lt; / script&gt; &#xA;&lt; div id =“somecontent”&gt;一些内容&lt; / div&gt; &#xA;&lt; script type =“text / javascript”&gt; console.log('bar');&lt; / script&gt;&#xA;  
&#xA;&#xA;

显然我在这里肯定有问题。任何人都可以对这个问题有所了解吗?

&#xA;&#xA;

我可以为此目的尝试Tidy,但我宁愿只有一个库来纠正用户错误在标记和任选使用白名单清理(这不是问题)。

&#xA;

1 个答案:

答案 0 :(得分:0)

问题由JSoup dev自己解决,见Github Issues

Jonathan Hedley写道:

  

如果要分析正文片段,则应使用   Jsoup.parseBodyFragment()方法。这会强制提供所有内容   进入正文,而不是试图创建一个完整的有效文档。

     

这里发生的是你要求Jsoup解析文档。   根据规范,HTML文档有头部和正文,在解析时,   第一个脚本进入头部(因为身体还没有开始   然而,脚本还可以。然后解析器看到一个div,   它不能进入​​头部,所以它移动到身体。一旦进入体内   模式,每个标签都保存在体内。

     

所以在你的范围内,脚本因为解析器而进入正文   已经切换到了身体。

     

Chrome和其他HTML解析器执行相同的操作:parsing result in Chrome