Как получить данные из таблицы данных из Sports Reference с помощью JSoup? - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь использовать JSoup, чтобы получить количество побед для команды из спортивной справочной таблицы.

В частности, я пытаюсь получить следующую точку данных, выделенную ниже, с html предоставленный код

Ниже я уже попробовал, но я получаю исключение нулевого указателя при попытке доступа к тексту этого элемента, сообщая, что мой код, вероятно, не выполняет синтаксический анализ HTML код правильно.

Element wins = document.selectFirst("td[data-stat=\"wins\"]");

Я хочу, чтобы текст этого элемента был 34 (или какое-то число в зависимости от количества побед в команде).

1 Ответ

1 голос
/ 12 января 2020

Проверьте, что ваш документ смог прочитать со страницы, и распечатайте его . Если он содержит HTML контент, который может динамически добавляться браузером JavaScript, вам необходимо использовать в качестве инструмента Selenium, а не Jsoup.

Для чтения HTML source , вы можете напишите так:

import java.io.IOException;
import org.jsoup.Jsoup;

public class JSoupHTMLSourceEx {
    public static void main(String[] args) throws IOException {
        String webPage = "https://www.basketball-reference.com/teams/CHI/2020.html#all_team_misc";
        String html = Jsoup.connect(webPage).get().html();
        System.out.println(html);
    }
}

Так как Jsoup поддерживает cssSelector , вы можете попробовать получить такой элемент, как:

public static void main(String[] args)  {
        String webPage = "https://www.basketball-reference.com/teams/CHI/2020.html#all_team_misc";
        String html = Jsoup.connect(webPage).get().html();

Document document = Jsoup.parse(html);
    Elements tds = document.select("#team_misc > tbody > tr:nth-child(1) > td:nth-child(2)");
        for (Element e : tds) {
            System.out.println(e.text());
        }
}

Но лучшим решением будет используйте Selenium - переносимый фреймворк для тестирования веб-приложений ( более подробно об инструменте Selenium ):

public static void main(String[] args) {
    String baseUrl = "https://www.basketball-reference.com/teams/CHI/2020.html#all_team_misc";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(
        By.xpath("//*[@id="team_misc"]/tbody/tr[1]/td[1]")).getText();  
        System.out.println(innerText); 
    driver.quit();
    }
}

Также вы можете попробовать вместо:

driver.findElement(By.xpath("//*[@id="team_misc"]/tbody/tr[1]/td[1]")).getText(); 

в этой форме :

driver.findElement(By.xpath("//[@id="team_misc"]/tbody/tr[1]/td[1]")).getAttribute("innerHTML");

PS В будущем было бы полезно добавить ссылки на источники, откуда вы хотите получить информацию или хотя бы фрагмент кода структуры DOM вместо изображения.

...