Получить 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, ожидается.
Я вижу два возможных решения:
- Вы анализируете сетевой трафик и идентифицируете вызовы ajax, которые делает сайт. Затем вы пытаетесь восстановить формат и запустить те же запросы, что и в JavaScript. Тогда вы можете восстановить таблицу.
- вы используете не Jsoup, а настоящий браузер, который загружает страницу и запускает JavaScript, включая все вызовы AJAX. Для этого вы можете использовать веб-драйвер Selenium. Существует браузер без заголовка phantomjs, который занимает относительно небольшое пространство, которое вы можете использовать в сочетании с селеновым веб-драйвером.
оба варианта имеют свои (дис) преимущества:
- Это занимает больше времени, так как вам нужно хорошо понимать сетевой трафик. Наградой будет очень быстрый и эффективный в использовании скребок.
- Программирование селена очень просто, и у вас не должно быть никаких трудностей в достижении вашей цели. Вам не нужно понимать внутреннюю работу сайта, который вы хотите очистить. Тем не менее, цена является еще одной зависимостью в вашем проекте. Потребление памяти высокое. Другой процесс запускается. Соскоб будет медленным.
Может быть, вы найдете другой источник с футбольным столом, который содержит информацию, которую вы хотите? Это может быть самым простым. Например, 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