Page content is loaded with JavaScript and Jsoup doesn't see it
Содержимое страницы загружается с помощью JavaScript, а Jsoup его не видит
Один блок на странице заполнен содержимым с помощью JavaScript, и после загрузки страницы с помощью Jsoup никакой этой информации нет. Есть ли способ получить также содержимое, сгенерированное JavaScript, при синтаксическом анализе страницы с помощью Jsoup?
for ( Element Tag : Tags ) { System.out.println( Tag.text() ); } } catch ( IOException e ) { e.printStackTrace(); } } }
Переведено автоматически
Ответ 1
JSoup - это HTML анализатор, а не какой-то встроенный браузерный движок. Это означает, что он совершенно не знает о каком-либо содержимом, которое добавляется в DOM с помощью Javascript после начальной загрузки страницы.
Чтобы получить доступ к этому типу содержимого, вам понадобится встроенный компонент браузера, на SO есть ряд обсуждений относительно такого компонента, например, Есть ли способ встроить браузер в Java?
Ответ 2
Решено в моем случае с помощью com.codeborne.phantomjsdriver ПРИМЕЧАНИЕ: это заводной код.
Когда вы запрашиваете страницу с веб-сайта, независимо от того, используете ли вы Jsoup или свой браузер, вам возвращается некоторый HTML. Jsoup может его проанализировать.
Однако большинство веб-сайтов включают Javascript в этот HTML-код или ссылаются на этот HTML-код, который заполняет страницу контентом. Ваш браузер способен выполнять Javascript и, таким образом, заполнять страницу. Jsoup этого не видит.
Понять это можно следующим образом: синтаксический анализ HTML-кода прост. Выполнение кода Javascript и обновление соответствующего HTML-кода намного сложнее, и это работа браузера.
Вот несколько решений для такого рода проблем:
Если вы сможете найти, какие вызовы Ajax выполняет код Javascript, то есть загружает содержимое, вы сможете использовать URL этих вызовов с помощью Jsoup. Для этого используйте инструменты разработчика в вашем браузере. Но это не гарантирует, что сработает:
возможно, URL-адрес является динамическим и зависит от того, что находится на странице в данный момент
если содержимое не является общедоступным, будут задействованы файлы cookie, и простого запроса URL ресурса будет недостаточно
В этих случаях вам нужно будет "имитировать" работу браузера. К счастью, такие инструменты существуют. Тот, который я знаю и рекомендую, - это PhantomJS. Он работает с Javascript, и вам нужно будет запустить его с Java, запустив новый процесс. Если вы хотите придерживаться Java, в этом посте перечислены некоторые альтернативы Java.
Ответ 4
Вы можете использовать комбинацию JSoup и HtmlUnit для получения содержимого страницы после завершения загрузки скриптов JavaScript.
// load page using HTML Unit and fire scripts WebClient webClient2 = new WebClient(); HtmlPage myPage = webClient2.getPage(new File("page.html").toURI().toURL());
// convert page to generated HTML and convert to document Document doc = Jsoup.parse(myPage.asXml());
// iterate row and col for (Element row : doc.select("table#data > tbody > tr")) for (Element col : row.select("td")) // print results System.out.println(col.ownText());
// clean up resources webClient2.close();
Сложный пример: загружаем login, получаем Session и CSRF, затем публикуем и ждем завершения загрузки домашней страницы (15 секунд)