Jsoup无法获取带有嵌套标签的外部HTML

时间:2019-03-27 17:24:14

标签: java jsoup

使用Jsoup连接到Instagram页面后,我想从一个标记中提取整个外部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

编辑: 我想保存整个span标记的HTML(我希望使用HtmlUnit / Jsoup获得相同的结果,就像我右键单击标记并单击edit html,然后右键单击->复制外部html一样!

1 个答案:

答案 0 :(得分:1)

不幸的是,Instagram是使用JavaScript框架react构建的Web应用程序。这意味着最终的HTML不会从服务器返回,而是由初始加载页面后由浏览器的客户端javascript生成的。

要查看react生成的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");