2016-05-27 36 views
1

我有HTML可能包含來自Surveymonkey的嵌入代碼,我希望通過jSoup運行以確保生成的HTML有效。 XSS在這裏不是問題。下面是一個示例HTML片段(編輯:JavaScript的內容是在這種情況下不相關的,所以我已經取代了Surveymonkey JS用一個簡單的日誌語句):在缺少第一串jsoup解析()似乎丟棄前導<script>元素

<script type="text/javascript">console.log('foo');</script> 
<div id="somecontent">some content</div> 
<script type="text/javascript">console.log('bar');</script> 

一個parse(htmlSnippet).body().html()結果script - 嵌段共:

<div id="somecontent"> some content </div> 
<script type="text/javascript">console.log('bar');</script> 

第二script - 嵌段不然而剝離。

如果我用空的<span></span>作爲前綴,jSoup保留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> 

parse(htmlSnippet).body().html()回報

<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,但我寧願有一個庫來糾正用戶在標記中的錯誤以及使用白名單進行清理(這不是問題)。

+0

請不要給我們顯示縮小的代碼 –

+0

您能否讓腳本更具可讀性? – Adam

+0

對不起,我編輯了原文,並用簡單的日誌語句替換了原來的Surveymonkey JS。實際的JS內容在這裏無關緊要,問題僅適用於任何主要的腳本塊。 – Ratcreamsoup

回答

0

問題已由JSoup開發人員自己解決,請參閱Github Issues

喬納森·赫德利說:

如果您解析身體片段,您應該使用 Jsoup.parseBodyFragment()方法。這強制所有提供的內容 進入正文,而不是試圖創建一個完整的有效文檔。

這裏發生了什麼是你要求Jsoup解析一個文檔。 根據規範,一個HTML文檔有一個頭部和一個主體,當解析時,第一個腳本進入頭部(因爲主體尚未開始 ,並且腳本在頭部是OK的),然後解析器看到一個div, 不能進入頭,所以它移動到身體。一旦身體 模式,每個標籤保留在體內。

所以在你的跨度,腳本進入人體。因爲 已經有了解析器切換至身體

Chrome和其他HTML解析器做同樣的事情:parsing result in Chrome