2017-01-19 99 views
1

我想用文字页面上选择一个脚本标签包含Jsoup没有选择的脚本标记

Document doc=jsoup.parse(somehtml); 
Elements ele=doc.select("script:contains(accountIndex)"); 

代码的网页上的脚本标签

<script>(function() {var vm = ko.mapping.fromJS({ 
"accountIndex": 1, 
"accountNumber": "*******", 
"hideMoreDetailsText": "Hide More Details", 
"viewAccountNumberText": "Show Account Number", 
"hideAccountNumberText": "Hide Account Number", 
});window.AccountDetails = vm;})();</script> 

我能够选择该脚本标签,如果我传似

script标签的CSS定位
Elements ele=doc.select("body > script:nth-child(44)"); 

有在页面上许多脚本标记,以便第二个方法不是通用的,将来可能会改变。

有人能告诉什么是与第一approach.Because我能够在页面上选择其他变量与包含jsoup的

回答

2

的选择:contains(text)查找具有该文本值的元素。脚本没有文本,它有数据(否则JS将在浏览器中可见)。您可以改用:containsData(data)选择器。

例如为:

Elements els = doc.select("script:containsData(accountIndex)"); 

这里是一个exampleSelector documentation具有所有处理过的查询类型(这不仅仅是严格的CSS)。

+0

它的工作!非常感谢!脚本没有文本,它有数据,它真的有明确的解释,为什么这是行不通的。 – Ravi

+0

还有1个问题,许多隐藏标签也被jsoup解析。尽管它们没有显示在浏览器中,那么为什么jsoup将它们的内容视为文本,而不是将脚本标签内容视为文本。 – Ravi

+0

像什么,例如? –

1

jsoup只支持CSS选择器的问题,以及那些只允许您选择基于关于DOM元素的CSS类和属性,而不是它们的文本内容(CSS selector based on element text?)。你可以尝试使用另一个框架解析和查询HTML,例如XOM和TagSoup喜欢这里描述:https://stackoverflow.com/a/11817487/7433999

或者你可以像这样的CSS类添加到youc脚本标签:

<script class="class1"> 
// script1 
</script> 
<script class="class2"> 
// script2 
</script> 

然后你就可以使用jsoup通过CSS再次选择脚本标签:

Elements elements = document.select("script.class1"); 
+0

Jsoup允许基于文本包含的选择,因为我可以通过相同的选择其他元素。 – Ravi