Получить innerHTML через Jsoup

Я пытаюсь собрать данные с этого сайта: http://www.bundesliga.de/de/liga/tabelle/

В исходном коде я могу видеть таблицы, но нет содержимого, только такие вещи, как:

<td>[no content]</td>
<td>[no content]</td>
<td>[no content]</td>
<td>[no content]</td>
....

С firebug (F12 в Firefox) я тоже не вижу никакого контента, но я могу выбрать таблицу и затем скопировать innerHTML через опцию firebug. В этом случае я получаю всю информацию о командах, но я не знаю, как получить таблицу с контентом в Jsoup.

2 ответа

Решение

Таблица не отображается на сервере напрямую, а создается клиентским JavaScript страницы и состоит из данных, поступающих к клиенту через AJAX. Так что то, что вы получите с наивным подходом Jsoup, ожидается.

Я вижу два возможных решения:

  1. Вы анализируете сетевой трафик и идентифицируете вызовы ajax, которые делает сайт. Затем вы пытаетесь восстановить формат и запустить те же запросы, что и в JavaScript. Тогда вы можете восстановить таблицу.
  2. вы используете не Jsoup, а настоящий браузер, который загружает страницу и запускает JavaScript, включая все вызовы AJAX. Для этого вы можете использовать веб-драйвер Selenium. Существует браузер без заголовка phantomjs, который занимает относительно небольшое пространство, которое вы можете использовать в сочетании с селеновым веб-драйвером.

оба варианта имеют свои (дис) преимущества:

  1. Это занимает больше времени, так как вам нужно хорошо понимать сетевой трафик. Наградой будет очень быстрый и эффективный в использовании скребок.
  2. Программирование селена очень просто, и у вас не должно быть никаких трудностей в достижении вашей цели. Вам не нужно понимать внутреннюю работу сайта, который вы хотите очистить. Тем не менее, цена является еще одной зависимостью в вашем проекте. Потребление памяти высокое. Другой процесс запускается. Соскоб будет медленным.

Может быть, вы найдете другой источник с футбольным столом, который содержит информацию, которую вы хотите? Это может быть самым простым. Например, http://www.fussballdaten.de/bundesliga/

Чтобы получить значение атрибута, используйте метод Node.attr(ключ String). Для текста элемента (и его комбинированных дочерних элементов) используйте Element.text(). Для HTML используйте Element.html() или Node. externalHtml() в зависимости от ситуации. Например:

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);
Element link = doc.select("a").first();

String text = doc.body().text(); // "An example link"
String linkHref = link.attr("href"); // "http://example.com/"
String linkText = link.text(); // "example""

String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"

ссылка: http://jsoup.org/cookbook/extracting-data/attributes-text-html

Другие вопросы по тегам