使用 jsoup 提取信息

Posted

技术标签:

【中文标题】使用 jsoup 提取信息【英文标题】:Extracting information using 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; 之间的比赛次数,但我并没有显示出来。我想知道如何获得这些数字。我已经能够得到玩家的签名和排名和等级。

【问题讨论】:

【参考方案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;

    ...

【讨论】:

以上是关于使用 jsoup 提取信息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jsoup 提取单独的文本节点?

使用Java jsoup库从Amazon提取评论

Jsoup - 提取文本

Jsoup:在无 CSS 的 HTML 中提取两个块之间的所有 HTML

Jsoup代码示例解析网页+提取文本

jsoup 提取 html 中的所有链接图片和媒体