Jsoup не может получить внешний HTML с вложенными тегами - PullRequest
1 голос
/ 27 марта 2019

после подключения к странице Instagram с помощью Jsoup я хочу извлечь весь внешний HTML из тега.Каким-то образом, когда я осматриваю страницу и копирую внешний html из тега, я получаю множество строк, в то время как я использую Jsoup лишь немногие (каким-то образом html вложенных тегов игнорируется). Любая помощь будет цениться, как получить весь html!

Код:

Document doc = Jsoup.connect("https://www.instagram.com/myUsername").get();

Element link = doc.selectFirst("span");
String linkOuter = link.outerHtml();
System.out.println(linkOuter);

Выход :

<span id="react-root">
  <svg width="50" height="50" viewbox="0 0 50 50" 
  style="position:absolute;top:50%;left:50%;margin:-25px 0 0 
  -25px;fill:#c7c7c7">
    <path d="M25 1c-6.52 0-7.34.03-9.9.14-2.55.12-4.3.53-5.82..." />
</svg></span>

Изображение строения: Structure

РЕДАКТИРОВАТЬ: Я хочу, чтобы весь HTML тега span был сохранен (я хочу тот же результат с HtmlUnit / Jsoup, что и когда я правщелкните по тегу, щелкните по редактировать HTML, а затем щелкните правой кнопкой мыши -> скопировать внешний HTML!

1 Ответ

1 голос
/ 27 марта 2019

К сожалению, Instagram - это веб-приложение, созданное с использованием Javascript Framework. Это означает, что окончательный HTML-код не возвращается с сервера, а создается с помощью javascript на стороне клиента в браузере после начальной загрузки страницы.

Чтобы увидеть HTML, сгенерированный реакцией, вам нужно оценить код javascript, который возвращается с сервера. JSoup - простой анализатор HTML, который не может оценить js, поэтому вам придется использовать другую библиотеку, например, HtmlUnit.

Например:

WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setJavaScriptEnabled(true); // enable javascript
webClient.getOptions().setThrowExceptionOnScriptError(false); //even if there is error in js continue
HtmlPage page = webClient.getPage(new URL("https://www.instagram.com/myUsername"));
webClient.waitForBackgroundJavaScript(5000); // important! wait when javascript finishes rendering

page.getElementById("react-root");
...