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

标签 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相同的结果,就像我右键单击标签,单击编辑html,然后右键单击->复制外部html!

最佳答案

不幸的是,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");

关于java - Jsoup 无法获取带有嵌套标签的外部 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383188/

相关文章:

java - 网站上的 JSOUP 登录不起作用

JSoup UserAgent,如何设置呢?

java - 将约会存储在 SQL 数据库(例如 Postgres)中以与 java.time 框架一起使用

java - 我应该如何让程序停止并等待某些事情? java

java - 我正在使用 jsoup 从网站 url 中提取图像,但我希望首先加载页面,有办法做到这一点吗?

java - 使用 Jsoup 从页面中提取信息

java - 使用 JSoup 进行屏幕抓取

Java 泛型通配符问题 : List<? extends A>

java - 在hibernate中避免@Column注释中的 "columnDefinition"属性

java - 有史以来最轻的 Java 虚拟机是什么? (KVM 除外)