如何从名称相同但数据不同的类中的类中获取数据?

时间:2019-05-08 17:44:41

标签: java html parsing jsoup html-parsing

我正在尝试提取我的DnD角色统计数据(力量,敏捷,智慧等)并打印数字。到目前为止,我尝试过的所有操作都不会提取任何数据并显示null。 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>

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

1 个答案:

答案 0 :(得分:0)

访问此页面时,首先看到的是带有正在加载微调器的空白页面: enter image description here

这总是表明一些附加数据已被JavaScript提取并动态添加到页面(DOM)中。 Jsoup无法执行JavaScript,这就是为什么您的选择返回null的原因。 您可以使用浏览器的调试器检查已加载的内容:

enter image description here

您可以看到数据存储为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。