【问题标题】:Jsoup element.class.class selcet method returning nullJsoup element.class.class 选择方法返回null
【发布时间】:2016-07-04 07:26:45
【问题描述】:

我正在尝试访问 <form> 元素内的 <button> 元素。

<form action="search.php" method="post" class="form-inline">
            <div class="form-group">
                <label for="value"><span class="text-uppercase">Lyrics Search:</span></label>
                <input type="text" name="value" class="form-control input-sm">
            </div>
            <div class="form-group">
                <select name="field" class="form-control input-sm">
                    <option value="artist" >Artist</option>
                    <option value="title" >Title</option>
                    <option value="body"  >Body</option>
                </select>
                <button type="submit" class="btn btn-primary btn-sm">Submit</button>
            </div>
        </form> 

现在 &lt;button&gt; 元素在 2 个 HTML 类中,我知道我需要在 select() 方法中连接这些类。 不知何故,我的代码在 select() 方法之后返回了 null

我的代码:

HtmlPage htmlPage = new HtmlPage(Jsoup.connect("http://www.lyricsplanet.com/").get());

            // Get to <div class="form-group">
            Element searchFormElement = htmlPage.getHtmlDocument().select("div.form-group").first();
searchFormElement.attr("name", searchedLyrics); // Setting the value of name to the searched lyrics.

            // Getting to <button type="submit" class="btn btn-primary btn-sm">Submit</button>
            Element buttonElement = htmlPage.getHtmlDocument().select("button.btn btn-primary btn-sm.form-inline").first();
            System.out.println(buttonElement.html());

在 - select("button.btn btn-primary btn-sm.form-inline").first(); 中,我尝试使用两个类来访问 &lt;button&gt; 元素。

那我做错了什么?

编辑 我才注意到有3个! &lt;button&gt; 元素的类。那就更乱了。

【问题讨论】:

    标签: java null css-selectors html-parsing jsoup


    【解决方案1】:

    我从未听说过 Jsoup 中有一个名为 HtmlPage 的类。你应该使用 Document-class 如果你调用 Jsoup.connect(...); 将返回它;

    你可以试试下面的代码:

    Document document = Jsoup.connect("http://www.lyricsplanet.com/").get(); // Just connect
    Element formElement = document.select("div#alphabet > form").first(); // Search for form
    formElement.select("input[name=value]").val(yourSearchValue); // Set your search value
    Element submitButton = formElement.select("button[type=submit]").first(); // Then search in form for submit button, otherwise your selector could find another submit button first
    

    HTML 表单元素(搜索字段和提交按钮)没有您可以使用的标识符。唯一的方法是使用这些特定的 css 选择器。

    编辑: 之后要提交表格吗?然后您不必搜索提交按钮。您可以在设置搜索值后提交表单。试试下面的代码:

    Document document = Jsoup.connect("http://www.lyricsplanet.com/").get();
    FormElement formElement = document.select("div#alphabet > form").forms().get(0); // Use FormElement instead of Element
    formElement.select("input[name=value]").val(yourSearchValue);
    Document searchResult = formElement.submit().post(); // Do anything you want with the search result page/html
    

    【讨论】:

    • HtmlPage 是我建立的一个类。它只是连接,没有什么花哨的。所以你发布的代码是去搜索把我的字符串值放在那里?
    • 我已经更新了我的答案。您可以直接提交表单而无需搜索提交按钮 :) 是的,此代码会将您的搜索值设置到表单中。
    • 谢谢伙计。你能告诉我如何触发按钮点击并获取HTML页面?
    • 为什么要触发按钮点击?用 formElement.submit().post();表单将被提交,您将获得包含搜索结果的文档。
    • 好吧,您可以使用class 属性作为标识符。但可能是,页面上有多个元素具有这些类。所以你不能确定你选择了正确的按钮。我更喜欢idname 属性,而不是使用class-selectors。如果一个元素没有任何idname,我更喜欢使用特定的选择器,例如div#alphabet &gt; form。然后您可以确定您选择了正确的元素。
    【解决方案2】:

    要使用多个类搜索一个元素,您必须像 select("button.btn, button.btn-primary, button.btn-sm") 这样将多个选择器分组。

    有关详细信息,请参阅选择器组合部分中的http://jsoup.org/cookbook/extracting-data/selector-syntax

    【讨论】:

    • 所以我将代码更改为Element buttonElement = htmlPage.getHtmlDocument().select("button.btn btn-primary btn-sm," + "button.form-inline,button.form-group").first();,它仍然返回null
    • 您必须删除该部分 "button.btn btn-primary btn-sm,"。提到的select("button.btn, button.btn-primary, button.btn-sm") 将搜索一个button,它分配了所有三个类btnbtn-primarybtn-sm
    • 让我解决这个问题。 class="btn btn-primary btn-sm 实际上是 3 个类,它们是 btnbtn-primary 和 `btn-sm?!不只是 1 个类名吗?
    • 是的,三个独立的类分配给一个按钮。这就是为什么您需要使用冒号进行分组的原因。这相当于每个按钮都分配了 btn、btn-primary 和 btn-sm 类
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2018-09-03
    • 2013-02-05
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多