【问题标题】:Jsoup is not Selecting Script TagJsoup 没有选择脚本标签
【发布时间】:2017-06-04 15:33:17
【问题描述】:

我正在尝试在页面上选择包含文本的脚本标签

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 的其他标签

【问题讨论】:

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


    【解决方案1】:

    jsoup 仅支持 CSS 选择器,这些选择器仅允许您基于 CSS 类和 DOM 元素的属性进行选择,而不是它们的文本内容 (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");
    

    【讨论】:

    • Jsoup 允许基于包含的文本进行选择,因为我可以通过相同的方式选择其他元素。
    【解决方案2】:

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

    例如:

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

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

    【讨论】:

    • 它正在工作!非常感谢!脚本没有文本,它有数据,它确实清楚地解释了为什么它不起作用。
    • 还有1个问题,许多隐藏标签也被jsoup解析。虽然它们没有显示在浏览器中,那么为什么jsoup将其内容视为文本而不将脚本标签内容视为文本。
    • 比方说什么?
    • 这在 jsoup 1.7.2 中出现错误,但在 1.10.2 中工作正常。这是预期的行为
    • 是的。 1.7.2 已经四岁了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多