Jsoup - скрытый класс div? - PullRequest
       8

Jsoup - скрытый класс div?

0 голосов
/ 03 февраля 2019

Я пытаюсь очистить класс div, но все, что я пробовал, до сих пор не получилось: (

Я пытаюсь очистить элемент (ы):

<a href="http://www.bellator.com/events/d306b5/bellator-newcastle-pitbull-vs- 
scope"><div class="s_buttons_button s_buttons_buttonAlt 
s_buttons_buttonSlashBack">More info</div></a>

с веб-сайта:http://www.bellator.com/events

Я попытался получить доступ к списку элементов, выполнив

Elements elements = document.select("div[class=s_container] > li");

, но ничего не получилось.

Затем я попытался получить доступ только к родителю с помощью

Elements elements = document.select("div[class=s_container]");

и это вернуло два div с именем класса "s_container", из которых мне не нужно ни одного: <</p>

затем я попытался получить доступ к этим родителям с

Elements elements = document.select("div[class=ent_m152_bellator module 
ent_m152_bellator_V1_1_0 ent_m152]");

И это ничего не вернуло

Я также пытался

Elements elements = document.select("div[class=ent_m152_bellator]");

, потому что я не был уверен насчет пробелов, но он ничего не возвращал либо

Затем я попытался получить доступ к его родителю с помощью

Elements elements = document.select("div#t3_lc");

и это сработало, но оно вернуло элемент, содержащий

<div id="t3_lc"> 
<div class="triforce-module" id="t3_lc_promo1"></div> 
</div>

, что немного странно, потому что я не вижу, что у него есть этот ребенок, когда я проверяю веб-сайт в chrome: S

Кто-нибудь знает, что происходит? Я чувствую себя немного потерянным ..

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Если кто-нибудь найдет это в будущем;Мне удалось решить это с помощью Selenium, не знаю, хорошее ли это / правильное решение, но, похоже, оно работает.

    System.setProperty("webdriver.chrome.driver", "C:\\Users\\PC\\Desktop\\Chromedriver\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.bellator.com/events");

    String html = driver.getPageSource();
    Document doc = Jsoup.parse(html);

    Elements elements = doc.select("ul.s_layouts_lineListAlt > li > a");
    for(Element element : elements) {
        System.out.println(element.attr("href"));
    }

Вывод:

http://www.bellator.com/events/d306b5/bellator-newcastle-pitbull-vs-scope
http://www.bellator.com/events/ylcu8d/bellator-215-mitrione-vs-kharitonov
http://www.bellator.com/events/yk2djw/bellator-216-mvp-vs-daley
http://www.bellator.com/events/e8rdqs/bellator-217-gallagher-vs-graham
http://www.bellator.com/events/281wxq/bellator-218-sanchez-vs-grimshaw
http://www.bellator.com/events/8lcbdi/bellator-219-koreshkov-vs-larkin
http://www.bellator.com/events/9rqguc/bellator-macdonald-vs-fitch
0 голосов
/ 04 февраля 2019

То, что вы видите в своем веб-браузере, не то, что видит Jsoup.Отключите JavaScript и обновите страницу, чтобы получить то, что получает Jsoup, ИЛИ нажмите CTRL + U («Показывать источник», а не «Проверять»!) В вашем браузере, чтобы увидеть исходный HTML-документ перед модификациями JavaScript.Когда вы используете отладчик вашего браузера, он показывает окончательный документ после изменений, поэтому он не подходит для ваших нужд.

Похоже, что весь раздел «UPCOMING EVENTS» динамически загружается JavaScript.Более того, этот раздел асинхронно загружается с помощью AJAX.Вы можете использовать отладчик браузера (вкладка «Сеть»), чтобы увидеть все возможные запросы и ответы.

enter image description here

Я нашел его, но, к сожалению, все необходимые данныевозвращается как JSON, поэтому вам понадобится другая библиотека для анализа JSON.

Это не конец плохих новостей, и этот случай более сложный.Вы можете сделать прямой запрос данных: http://www.bellator.com/feeds/ent_m152_bellator/V1_1_0/d10a728c-547e-4a6f-b140-7eecb67cff6b, но URL кажется случайным, и немногие из этих URL (по одному на предстоящее событие?) Включены в код JavaScript в HTML.

enter image description here

Мой подход заключается в том, чтобы получить URL-адреса этих каналов с помощью чего-то вроде:


        List<String> feedUrls = new ArrayList<>();

        //select all the scripts
        Elements scripts = document.select("script");
        for(Element script: scripts){
            if(script.text().contains("http://www.bellator.com/feeds/")){
                // here use regexp to get all URLs from script.text() and add them to feedUrls

            }
        }

        for(String feedUrl : feedUrls){
            // iterate over feed URLs, download each of them
            String json = Jsoup.connect(feedUrl).ignoreContentType(true).get().body().toString();
            // here use JSON parsing library to get the data you need

        }

Альтернативный подход заключается в прекращении использования Jsoup из-за его ограничений и использовании Selenium.Webdriver, поскольку он поддерживает динамические модификации страниц с помощью JavaScript, так что вы получите HTML-код конечного результата - именно то, что вы видите в веб-браузере и Inspector.

...