使用 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 数量和<h1></h1>
之间的比赛次数,但我并没有显示出来。我想知道如何获得这些数字。我已经能够得到玩家的签名和排名和等级。
【问题讨论】:
【参考方案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 命名组来获取三种类型的战斗统计 allBattles
、normalBattles
、rankedBattles
以及所有属性
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 提取信息的主要内容,如果未能解决你的问题,请参考以下文章