Jsoup不是选择脚本标签

时间:2017-01-19 19:34:25

标签: html selenium selenium-webdriver jsoup html-parsing

我正在尝试在包含

的文本的页面上选择一个脚本标记
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>

如果我传递脚本标记的css定位器,我可以选择此脚本标记,如

  Elements ele=doc.select("body > script:nth-child(44)");

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

有人可以告诉第一种方法有什么问题。因为我能够在包含jsoup的页面上选择其他标签

2 个答案:

答案 0 :(得分:3)

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

E.g:

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

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

答案 1 :(得分: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");