【问题标题】:JSoup doesn't load the whole HTML [duplicate]JSoup 不加载整个 HTML [重复]
【发布时间】:2019-06-03 16:35:58
【问题描述】:

我想抓取一个网站,但是当我使用Jsoup.connect(url) 连接到它时,只加载了页面的一部分。

当我将页面下载为 html 时,我看到页面的一部分只有一个加载器图标,因此我得出结论,页面的该部分是后来从其他来源加载的。

有趣的是,inspect 元素包含缺少的 html,而查看页面源代码却没有。从 jSoup 加载的 HTML 与从“查看页面源”打开时基本相同。

有没有办法绕过这个并加载整个页面,因为它显示在浏览器中?

有问题的页面是这样的:https://www.oddsportal.com/tennis/australia/atp-australian-open-2017/results/page/1/

询问我可以提供的任何其他信息。

================

编辑: 我正在像这样连接到 url:

Document doc = null;

try {
    doc =  Jsoup.connect(url).get();
} catch (IOException e) {
    e.printStackTrace();
}

我正在使用 css 选择器获取这个 div:

Elements tournamentTable = doc.select("div[id=tournamentTable]");

tournamentTable 的内容是<div id="tournamentTable"></div>

【问题讨论】:

  • 正在加载页面的哪一部分?你的代码是什么样的?请编辑您的问题并添加这些详细信息。
  • 从 jSoup 加载时,@CardinalSystem Div 和 id=tournamentTable 为空。
  • @CardinalSystem 已编辑,但我认为它与代码无关,因为此页面的源代码也不包含此 div 中的任何内容。如果我检查 div 内的某些元素(在 chrome 中),我只能看到这个 div。
  • 数据正在被 Javascript 注入。您需要等待页面完全加载,然后拉取其内容。或者直接查询其后端 API。
  • 在浏览器中关闭对该页面的 JavaScript 支持,看看它的外观。这就是 Jsoup 的价值所在。它不是支持 JavaScript 的浏览器模拟器,因此您需要使用其他工具。请参阅副本(问题顶部的链接)以获取建议。

标签: java web-scraping web-crawler jsoup


【解决方案1】:

似乎id=tournamentTable 是使用javascript 动态生成的。 JSoup 没有评估 javascript,所以你必须使用像 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
webClient.waitForBackgroundJavaScript(5000); // important! wait until javascript finishes rendering
HtmlPage page = webClient.getPage(url);

page.getElementById("tournamentTable");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2013-07-13
    • 2015-09-14
    • 2013-10-28
    • 2018-02-05
    • 2014-06-20
    • 2013-09-18
    相关资源
    最近更新 更多