如何获取 Jsoup 元素

how to get Jsoup element

提问人:Artist 提问时间:2/11/2023 最后编辑:EritreanArtist 更新时间:2/11/2023 访问量:52

问:

<li data-test-component="ProductStats" class="sc-qVkRw dDEgow">
    <dl data-test-component="DescriptionList" class="sc-ejxegM hEIIuR">
        <dt labelwidth="208px" labelwidthmobile="168px" class="sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO">В избранном</dt>
        <dd labelwidth="208px" labelwidthmobile="168px" class="sc-cOxWqc sc-fVmuvm eOPaPs dVayGV">1</dd>
        <dt labelwidth="208px" labelwidthmobile="168px" class="sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO">Просмотры</dt>
        <dd labelwidth="208px" labelwidthmobile="168px" class="sc-cOxWqc sc-fVmuvm eOPaPs dVayGV">2</dd>
        <dt labelwidth="208px" labelwidthmobile="168px" class="sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO">Размещено</dt>
        <dd labelwidth="208px" labelwidthmobile="168px" class="sc-cOxWqc sc-fVmuvm eOPaPs dVayGV">Сегодня в 13:52</dd>
    </dl>
</li>

元素本身如下所示。我需要得到“Сегодня в 13:52”。

通过 xpath,这将像这样完成 >> //li [@data-test-component = 'ProductStats'],并进一步通过 href。我不明白如何在jsoup中实现选择器

尝试通过 F12 复制选择器

java 解析 jsoup html-解析

评论

0赞 Artist 2/11/2023
我忘了添加“今天 13:52”动态,所以简单地通过文本搜索是没有意义的。
0赞 Eritrean 2/11/2023
你能分享到该页面的链接吗?如果内容在页面加载后填充了 JavaScript,则 Jsoup 可能不是正确的工具。

答:

1赞 Vikram 2/11/2023 #1

我假设您的目标是 dl 元素的最后一个子元素的文本

Document doc =  Jsoup.parse("<li data-test-component=\"ProductStats\" class=\"sc-qVkRw dDEgow\"><dl data-test-component=\"DescriptionList\" class=\"sc-ejxegM hEIIuR\"><dt labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO\">В избранном</dt><dd labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-fVmuvm eOPaPs dVayGV\">1</dd><dt labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO\">Просмотры</dt><dd labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-fVmuvm eOPaPs dVayGV\">2</dd><dt labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO\">Размещено</dt><dd labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-fVmuvm eOPaPs dVayGV\">Сегодня в 13:52</dd></dl></li>");
    Elements elList = doc.body().select("li[data-test-component='ProductStats']");
    if(elList!=null && elList.size()>0 && elList.get(0).childNodeSize()>0){
        Element liElement= elList.get(0);
        if(liElement.childNodeSize()>0){
            if(liElement.childNodeSize()>0){
                Element firstChildElOfLi = liElement.child(0);
                Element targetEl = firstChildElOfLi.child(firstChildElOfLi.childNodeSize()-1);
                System.out.println(targetEl.text());
            }
        }
    }

评论

0赞 Artist 2/11/2023
类是动态的,在每个页面上它们的名称都不同。
0赞 Vikram 2/11/2023
@Artist只要 li 标签的 data-test-component 属性相同,并且您想要 dl 标签的最后一个子项的文本,给定的代码就可以正常工作,因为它没有任何类名依赖关系
0赞 Vikram 2/12/2023
@モキャデ这很好,一行解,但是如果 li 元素的第一个子元素不是 dl,在这种情况下,你会怎么做?
1赞 モキャデ 2/11/2023 #2

您可以通过一种方法获得所需的内容。selectFirst

String html = "<li data-test-component=\"ProductStats\" class=\"sc-qVkRw dDEgow\">\r\n"
    + "    <dl data-test-component=\"DescriptionList\" class=\"sc-ejxegM hEIIuR\">\r\n"
    + "        <dt labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO\">В избранном</dt>\r\n"
    + "        <dd labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-fVmuvm eOPaPs dVayGV\">1</dd>\r\n"
    + "        <dt labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO\">Просмотры</dt>\r\n"
    + "        <dd labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-fVmuvm eOPaPs dVayGV\">2</dd>\r\n"
    + "        <dt labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-hIsuHl kWkcWl fhKhnO\">Размещено</dt>\r\n"
    + "        <dd labelwidth=\"208px\" labelwidthmobile=\"168px\" class=\"sc-cOxWqc sc-fVmuvm eOPaPs dVayGV\">Сегодня в 13:52</dd>\r\n"
    + "    </dl>\r\n"
    + "</li>";
Document doc = Jsoup.parse(html);
Element e = doc.selectFirst("li[data-test-component=ProductStats] > dl > :last-child");
System.out.println(e.text());

输出:

Сегодня в 13:52