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