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


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



 parse(htmlSnippet).body()。html()
会产生一个缺少第一个脚本
-block的字符串:
< div id =“somecontent”>一些内容< / div> 
< script type =“text / javascript”> console.log('bar');< / script>



 然而,第二个脚本
-block没有被剥离。
如果我用一个空的<前缀整个东西。 span>< / span>
,jSoup保留脚本
。因此,对于以下代码段
< span>< / span>
< script type =“text / javascript”>控制台。 log('foo');< / script>
< div id =“somecontent”>一些内容< / div>
< script type =“text / javascript”>控制台。日志( '巴');< /脚本>
 代码>
&#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;答案 0 :(得分:0)
问题由JSoup dev自己解决,见Github Issues。
Jonathan Hedley写道:
如果要分析正文片段,则应使用 Jsoup.parseBodyFragment()方法。这会强制提供所有内容 进入正文,而不是试图创建一个完整的有效文档。
这里发生的是你要求Jsoup解析文档。 根据规范,HTML文档有头部和正文,在解析时, 第一个脚本进入头部(因为身体还没有开始 然而,脚本还可以。然后解析器看到一个div, 它不能进入头部,所以它移动到身体。一旦进入体内 模式,每个标签都保存在体内。
所以在你的范围内,脚本因为解析器而进入正文 已经切换到了身体。
Chrome和其他HTML解析器执行相同的操作:parsing result in Chrome