使用Java和jsoup从网站上的标记中提取src值

问题描述 投票:0回答:1

我想提取某个网站的src标签的<img src="...">属性内的网址。如何使用Jsoup中的Java来做到这一点?到目前为止,我只尝试读取整个标签并在控制台中打印输出,但似乎什么都没发生。我很想知道一般如何访问标签的属性,因为我需要对各种标签执行相同的过程。在下面的测试代码中,我正在使用Stringstable读取一些raritySelector,并且输出是预期的结果。但是,当我尝试使用img从网站上读取iconSelector标签时,控制台上没有任何内容。我是否需要指定其他内容才能读取<img>的属性/详细信息,或者我做错了什么?

        String url = "https://dbz.space/cards/";
        Document page = Jsoup.connect(url).get();
        ArrayList<String> cardRarity = new ArrayList<>();
        ArrayList<String> iconUrls = new ArrayList<>();

        for(int i=1; i < 6; i++) {

            String iconSelector = "body > div.view > section.list.gi > div:nth-child(1) > div.content > img";
            String raritySelector = "body > div.view > section.list.gi > div:nth-child(" + i + ") > a > table > tbody > tr:nth-child(2) > td.rarity > i";

            Elements rarities = page.select(raritySelector);
            Elements icons = page.select(iconSelector);

            for(Element e : rarities) {
                cardRarity.add(e.text());
            }

            for(Element e : icons) {
                iconUrls.add(e.text());
            }
        }


        for(String s : cardRarity) {
            System.out.println(s);
        }
        for(String s : iconUrls) {
            System.out.println(s);
        }

PS:我之前从未使用过Jsoup,也没有进行过网站爬虫工作,在进行了一些研究之后,我遇到了各种各样的帖子,有人建议您使用RegexString API,但没有一个人同意哪一条是正确的方法。如果可能的话,请向我指出正确的方向。

java jsoup extract
1个回答
0
投票

您的“问题”是,jsoup是html解析器,并且可以处理从该网站返回的纯HTML响应。

它的处理方式不像“正常”浏览器,因此Javascript未执行。

链接的页面初始响应是否不是包含具有此选择器的元素

"body > div.view > section.list.gi > div:nth-child(1) > div.content > img"

相反,有一些初始标记,并且它会在您的浏览器中被Javascript更改以显示完整的网站

初始标记看起来像这样(您可以通过查看源代码来查看,例如chrome view-source:https://dbz.space/cards/

<section class="list gi">
    <div class="item card cb45 eb24 rb5 d0" res="1018030" base="1018031" aim="" quantity="" release="" imgur="MsVAmR3" ele="4" type="2">
        <div class="content"></div>
        <a class="ab" href="/cards/1018031-androids-17-18android-16-the-androids-journey" title="The Androids' Journey - Androids #17 & #18/Android #16" hash="7b0463b1a48488b0e3670cc3ae46731f">
            <table>
                <tr>
                    <td class="dokkan"></td>
                    <td class="element"></td>
                </tr>
                <tr>
                    <td class="rarity">
                        <i>lr</i>
                    </td>
                    <td class="lock off">
                        <i class="material-icons off">&#xE898;</i>
                        <i class="material-icons on">&#xE897;</i>
                    </td>
                </tr>
            </table>
        </a>
        <div class="dv">19836</div>
    </div>
    <div class="item card cb25 eb12 rb5 d0" res="1012900" base="1012901" aim="" quantity="" release="" imgur="vId5fzO" ele="2" type="1">
        <div class="content"></div>
        <a class="ab" href="/cards/1012901-super-saiyan-goku-super-saiyan-vegeta-fused-super-power" title="Fused Super Power - Super Saiyan Goku & Super Saiyan Vegeta" hash="9fb89cd0e5449af5bae38a8602879494">
        ...
    </div>
</section>

因此,如果您相应地调整选择器

"body > div.view > section.list.gi > div.item.card";

例如,您可以读出imgur文件名或其他信息

e.attr("imgur")

作为替代方案,您可以使用phantomjs / GhostDriver(只是google),其作用类似于浏览器引擎,以便先获取页面,然后再使用例如jsoup。

© www.soinside.com 2019 - 2024. All rights reserved.