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