Извлечение значения src из тега <img>на веб-сайте с использованием java и jsoup - PullRequest
1 голос
/ 13 октября 2019

Я хочу извлечь URL, который находится внутри атрибута src тега <img src="..."> определенного веб-сайта. Как я могу сделать это, используя Jsoup в Java? До сих пор я только пытался прочитать весь тег и распечатать вывод в консоли, но ничего не получается. Я хотел бы знать, как получить доступ к атрибутам тегов в целом, так как мне нужно будет сделать этот же процесс для различных тегов. В моем тестовом коде ниже я читаю Strings из table, используя 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 и не работал со списком сайтови после небольшого исследования я наткнулся на различные посты, где люди предлагали вам использовать Regex или String API, но ни один из них не мог сообразить, какой из них является правильным. Пожалуйста, укажите мне правильное направление по этому вопросу, если это возможно.

1 Ответ

2 голосов
/ 13 октября 2019

Ваша "проблема" в том, что 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.

...