jsoup parse()似乎删除了前导<;脚本>;元素

jsoup parse()似乎删除了前导<;脚本>;元素,jsoup,Jsoup,我的HTML可能包含Surveymonkey中的嵌入代码,我希望通过jSoup运行该代码,以确保生成的HTML有效。XSS在这里不是问题。下面是一个示例HTML片段(编辑:JavaScript的内容与本例无关,因此我用一个简单的日志语句替换了Surveymonkey JS): 但是,第二个脚本-块没有被剥离 如果我用空的作为整个脚本的前缀,jSoup将保留脚本。下面的代码片段 <span></span> <script type="text/javascript"&

我的HTML可能包含Surveymonkey中的嵌入代码,我希望通过jSoup运行该代码,以确保生成的HTML有效。XSS在这里不是问题。下面是一个示例HTML片段(编辑:JavaScript的内容与本例无关,因此我用一个简单的日志语句替换了Surveymonkey JS):

但是,第二个
脚本
-块没有被剥离

如果我用空的
作为整个脚本的前缀,jSoup将保留
脚本。下面的代码片段

<span></span>
<script type="text/javascript">console.log('foo');</script>
<div id="somecontent">some content</div>
<script type="text/javascript">console.log('bar');</script>
很明显,我一定是出了什么问题。有人能解释一下这个问题吗


为此,我可以尝试使用Tidy,但我希望只有一个库来纠正标记中的用户错误,并可以选择使用白名单进行清理(这不是这里的问题)。

问题是由JSoup开发人员自己解决的,请参阅

乔纳森·赫德利写道:

如果您正在解析主体片段,则应使用 parseBodyFragment()方法。这将强制提供所有内容 而不是试图创建一个完整有效的文档

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

因此,在您的span中,脚本进入主体,因为解析器 已经换到尸体上了

Chrome和其他HTML解析器做同样的事情:


问题由JSoup开发人员自己解决,请参阅

乔纳森·赫德利写道:

如果您正在解析主体片段,则应使用 方法。该方法强制提供所有内容 而不是试图创建一个完整有效的文档

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

因此,在您的span中,脚本进入主体,因为解析器 已经换到尸体上了

Chrome和其他HTML解析器做同样的事情:


请不要向我们展示缩小的编解码器。你可以让你的脚本更具可读性吗?对不起,我编辑了原始帖子,并用简单的日志语句替换了原始的Surveymonkey JS。实际的JS内容在这里并不重要,问题只适用于任何主要的脚本块。请不要向我们展示缩小的编解码器。你可以让你的脚本更真实一点Diable?抱歉,我编辑了原始帖子,并用简单的日志语句替换了原始的Surveymonkey JS。实际的JS内容在这里是无关的,这个问题只适用于任何主要的脚本块。
<div id="somecontent"> some content </div> 
<script type="text/javascript">console.log('bar');</script>
<span></span>
<script type="text/javascript">console.log('foo');</script>
<div id="somecontent">some content</div>
<script type="text/javascript">console.log('bar');</script>
<span></span> 
<script type="text/javascript">console.log('foo');</script> 
<div id="somecontent">some content</div> 
<script type="text/javascript">console.log('bar');</script>