首页 > 解决方案 > 如何从同名但数据不同的类中的类中获取数据?

问题描述

我试图提取我的 DnD 角色统计数据(力量、敏捷、智慧等)并打印数字。到目前为止,我尝试过的一切都没有提取任何数据并打印为空。https://www.dndbeyond.com/characters/11196319

我试过了

doc.select("ct-ability-summary__label");

doc.select("ct-ability-summary__label").first();

doc.select("div[class=ct-ability-summary__primary:eq(0)]");

List<String> Stats = new ArrayList<>();
for( Element element : doc.select("div[class=ct-ability-summary__primary]") )
        {
            Stats.add(element.text());
        }


<div class="ct-quick-info__abilities">
    <div class="ct-quick-info__ability">
        <div class=" ct-ability-summary">
            <div class="ct-ability-summary__heading">...</div>
            <div class="ct-ability-summary__primary">10</div>
            <div class="ct-ability-summary__secondary">...</div>
    <div class="ct-quick-info__ability">
        <div class=" ct-ability-summary">
            <div class="ct-ability-summary__heading">...</div>
            <div class="ct-ability-summary__primary">13</div>
            <div class="ct-ability-summary__secondary">...</div>

我试图从中提取数据并将其打印出来。所以在这种情况下,我希望打印 10 和 13。它可以添加到列表/数组或单个字符串中。只要它获得可用于打印的数据。如果这两个可以工作,假设我可以让其他 4 个工作。

标签: javahtmlparsingjsouphtml-parsing

解决方案


当您访问此页面时,您首先看到的是带有加载微调器的空白页面: 在此处输入图像描述

这始终表明 JavaScript 会获取一些额外的数据并动态添加到页面 (DOM) 中。Jsoup 无法执行 JavaScript,这就是您的选择返回 null 的原因。您可以使用浏览器的调试器来检查加载的内容:

在此处输入图像描述

您可以看到数据存储为 JSON,并且可以使用此 URL 直接访问: https ://www.dndbeyond.com/character/11196319/json

不幸的是,Jsoup 无法解析 JSON,因此您必须使用其他一些库。另请注意,此页面执行一些计算,并非您看到的所有内容都直接记录在此 JSON 中。例如,如果你格式化它,你可以看到你有一些统计数据:

stats: [
{
id: 1,
name: null,
value: 10},
{
id: 2,
name: null,
value: 13},
{
id: 3,
name: null,
value: 14},
{
id: 4,
name: null,
value: 15},
{
id: 5,
name: null,
value: 12},
{
id: 6,
name: null,
value: 12}
],

似乎有些不对劲,因为你的智力不是 15 而是 16,那是因为你有种族加值 +1,而且这个值存储在其他地方。找出这些统计数据如何相互影响可能很复杂。

因此,为了确保您拥有正确的最终值而不是基础值,我建议您放弃解析 JSON 的 Jsoup 方法并改用 Selenium Webdriver,因为它能够获得您看到的确切值,因为它执行 JavaScript。


推荐阅读