使用 java 和 jsoup 从网站上的 <img> 标签中提取 src 值

Extracting the src value from an <img> tag on a website using java and jsoup

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

        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);
        }

P.S:我以前从未使用过 Jsoup,也从未使用过网站 scraping,在做了一些研究之后,我看到了各种人们建议的帖子您使用 RegexString API,但他们中的 none 可以就哪一个是正确的方法达成一致。如果可能的话,请为我指出正确的方向。

您的 "Problem" 是,jsoup 是一个 html 解析器,可以处理从该网站返回的普通 html 响应。

它不像 "normal" 浏览器那样处理它,因此例如Javascript没有执行。

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

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

取而代之的是一些初始标记,它在您的浏览器中被 Javascript 更改为 display/build 整个网站

初始标记看起来像这样(您可以通过查看源代码看到这一点,例如 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.