【问题标题】:How to get data from page source using java and jsoup如何使用java和jsoup从页面源获取数据
【发布时间】:2018-07-18 22:23:09
【问题描述】:

如何从 以下页面来源? 我只想从源代码中获取这些值,但我不确定最好的方法。

  <div class="txt-block">
            <h4 class="inline">Budget:</h4>$23,000,000
            <span class="attribute">(estimated)</span>
        </div>

        <div class="txt-block">
            <h4 class="inline">Opening Weekend USA:</h4> $260,382,
<span class="attribute">20 December 2013</span>, <span class="attribute">Limited Release</span>
        </div>

        <div class="txt-block">
<h4 class="inline">Gross USA:</h4> $25,568,251
        </div>
        <div class="txt-block">
<h4 class="inline">Cumulative Worldwide Gross:</h4> $47,351,251
        </div>

我试过这样:

    String url = "https://www.imdb.com/title/tt1798709";
    Connection connection = Jsoup.connect(url);
    Document document = connection.get();
    Elements element = document.getElementsByClass("txt-block");


    String gross = "";
    String budget = "";

    String budgetRegex = "Budget:.*";
    String grossRegex = "Cumulative Worldwide Gross:.*";

    for (Element e : element) {
        if (e.text().matches(budgetRegex)) {
            String text = e.text();
            budget = StringUtils.substringBetween(text, "$", " ");
            break;
        } else {
            budget = null;
        }
    }
    for (Element e : element) {
        if (e.text().matches(grossRegex)) {
            String text = e.text();
            gross = StringUtils.substringAfter(text, "$");
                break;
        } else {
            gross = null;
        }

    }
    System.out.println(gross + ", " + budget);

它正在工作,但有更好的解决方案吗?

【问题讨论】:

  • 如果美元金额包含在 DOM 元素中,那么检索它们几乎是微不足道的。
  • “它正在工作,但如何做得更好?”在这种情况下,您的问题更适合codereview.stackexchange.com
  • 我投票结束这个问题,因为它属于 Stack Exchange 网络中的另一个站点,即 codereview.stackexchange.com

标签: java html css jsoup


【解决方案1】:

使用ownText() 代替子字符串,并且只循环一次,而不是两次。试试这个:

    String url = "https://www.imdb.com/title/tt1798709";
    Connection connection = Jsoup.connect(url);
    Document document = connection.get();
    Elements elements = document.select("div.txt-block");

    String gross = "";
    String budget = "";

    final String budgetRegex = "Budget:";
    final String grossRegex = "Cumulative Worldwide Gross:";

    for (Element e : elements) {
        final String h4Text = e.getElementsByTag("h4").first().text();
        switch (h4Text) {
            case budgetRegex:
                budget = e.ownText();
                break;
            case grossRegex:
                gross = e.ownText();
                break;
        }
        if (!gross.isEmpty() && !budget.isEmpty()) { //this IF is optional, just added for performance
            break;
        }
    }
    System.out.println(gross + ", " + budget);

【讨论】:

    【解决方案2】:

    您可以使用 jsoup 伪选择器来完成这项工作:

        Document document = Jsoup.parse(html);
        String budget = document.select("div:contains(Budget:)").first().ownText();
        String gross = document.select("div:contains(Cumulative Worldwide Gross:)").first().ownText();
        System.out.println(gross + ", " + budget);
    

    更多关于伪选择器的信息可以在这里找到:https://jsoup.org/cookbook/extracting-data/selector-syntax

    【讨论】:

      猜你喜欢
      • 2013-05-15
      • 1970-01-01
      • 2019-09-16
      • 2013-05-27
      • 2020-12-15
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      相关资源
      最近更新 更多