【问题标题】:Extracting information using jsoup使用 jsoup 提取信息
【发布时间】:2022-01-03 09:35:34
【问题描述】:

您好,我是使用 JSoap 和 html 的新手。我目前正在尝试从游戏统计网站获取信息,但在获取 <h1></h1> 之间的信息时遇到问题。

Document document = Jsoup.connect("https://na.wildstats.gg/en/profile/60ae4f204a9aa2000f3d5f33").get();
Elements winRates = document.getElementsByClass("text-center m-0");
String html = winRates.text();


System.out.println(winRates);
System.out.println(html);
System.out.println("test");

输出:

<h1 class="text-center m-0" id="battleStats_WinRate"></h1>
<h1 class="text-center m-0" id="battleStats_MVP"></h1>
<h1 class="text-center m-0" id="battleStats_Played"></h1>
test

当我查看网站时,有一个百分比、MVPS 数量和&lt;h1&gt;&lt;/h1&gt; 之间的比赛次数,但我并没有显示出来。我想知道如何获得这些数字。我已经能够得到玩家的签名和排名和等级。

【问题讨论】:

    标签: java html jsoup


    【解决方案1】:

    Jsoup 用于静态或非常简单的 html 网站。

    在第一个 http 请求中的复杂站点下载一个基本的或空的 index.html,然后使用 ajax,从远程服务(如 rest apis 或返回 json 的微服务)获取信息。

    这就是为什么,soups 会返回那个空的 html。

    解决方案 1

    使用另一个使用内存中浏览器的框架。这种框架能够等待,直到 ajax 获得信息,然后您将获得预期值:

    • puppeteer.js
    • casper.js
    • sinon.js

    解决方案 2

    如果您的唯一目标是获取数据,您可以使用您喜欢的浏览器的开发者控制台并确定以 json 格式返回您的游戏数据的 http 服务。之后,通过一个非常简单的 http 连接,您将获得游戏数据

    解决方案 3

    使用 selenium 和无头浏览器获取数据,等待 ajax 响应。

    【讨论】:

      【解决方案2】:

      此代码将使用 JSoup 和 Regex 命名组来获取三种类型的战斗统计 allBattlesnormalBattlesrankedBattles 以及所有属性

      Document document = Jsoup.connect("https://na.wildstats.gg/en/profile/60ae4f204a9aa2000f3d5f33").get();
      Elements elements = document.select("script");
      Pattern parserPattern = Pattern.compile("'(?<BATTLE>[a-zA-Z]+)': [{](?<ATTRIBUTES>[\n 'a-zA-Z0-9+:\"0-9a-zA-Z,.]+)[};]");
      Matcher matcher = parserPattern.matcher(elements.toString());
      while (matcher.find()) {
          String battleType = matcher.group("BATTLE");
          System.out.println("Battle Type: " + battleType);
          String[] attributesLines = matcher.group("ATTRIBUTES")
                          .replaceAll(",\n", "\n")
                          .split("\n");
          for (String line : attributesLines) {
              String[] keyValue = line.trim().split(":");
              if (keyValue.length != 2) continue;
              String key = keyValue[0];
              String value = keyValue[1];
              System.out.println("\t" + key + " : " + value);
          }
      }
      

      输出将是

      然后您可以为每场战斗创建一个类,其中包含一个名称和属性映射来表示结果并在 UI 中使用它们

      public class Battle {
      
          private String name;
          private Map<String, String> attributes;
      
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        相关资源
        最近更新 更多