【问题标题】:getElementById not working for Facebook messagesgetElementById 不适用于 Facebook 消息
【发布时间】:2017-07-13 20:29:12
【问题描述】:

由于某种原因,在解析https://touch.facebook.com/messages

使用getElementById("threadlist_rows"),即使 id 确实存在,我也会收到 null。

它在html() 输出中,它可以在线尝试jsoup,我可以毫无问题地获取其他ID,例如root

同样的方法一直适用于其他页面,我能看到的唯一区别是,在正文中还有很多其他 id 前缀为 threadlist_row_ 的元素。

getElementsByClass("aclb") 等其他各种选择器似乎也没有返回此页面的完整列表。

谁能解释一下这个问题?

【问题讨论】:

  • 它不适用于 Jsoup,因为 Jsoup 只解析静态 HTML。您提到的具有 ID 的元素是动态创建的(JavaScript),Jsoup 不执行任何 JavaScript 代码。检查 PhantomJS 库 (*.com/a/39369662/2194470)
  • @SzymonStepniak 但如果 html 方法确实显示 id 已经存在,它不应该工作吗?加载后未添加元素。我必须检查 aclb 元素,因为情况可能不同。
  • 不,当 Jsoup 打开网站时,此元素不存在。它显示在 Web 浏览器中,因为 Web 浏览器解释创建此元素的 JavaScript 代码。 Jsoup 不解释任何 JavaScript,所以这个元素永远不会为 Jsoup 显示。如果您需要一个解释 JavaScript 的解决方案,您将不得不仔细研究诸如PhantomJS(它解释 JavaScript)
  • @SzymonStepniak 谢谢。刚刚在我的 chrome 上禁用了 javascript,发现情况确实如此。如果您想发布答案,我会接受它
  • 完成。看看我发现了什么——将 PhantomJS 与 Jsoup 结合起来。在您的情况下,这可能是最好的方法。祝你好运!

标签: jsoup


【解决方案1】:

在您的情况下,Jsoup 不会像您预期的那样工作。 id为threadlist_rows的元素在页面加载后由JavaScript函数渲染。 Jsoup 不解释任何 JavaScript 代码 - 它仅适用于静态 HTML。您可以通过调查页面源 (Ctrl + U) 或暂时关闭 Web 浏览器中的 JavaScript 来“模拟”Jsoup 看到的内容。

考虑使用替代方案,例如:

  • PhantomJS (http://phantomjs.org/),一个可使用 JavaScript API 编写脚本的无头 WebKit。它具有对各种 Web 标准的快速原生支持:DOM 处理、CSS 选择器、JSON、Canvas 和 SVG。

您也可以尝试做本主题中提到的事情:https://*.com/a/39174441/2194470(使用 PhantomJS 下载 HTML 并使用 Jsoup 操作 DOM 结构)。这可能是您的最佳选择。希望对你有帮助:)

【讨论】:

  • 太棒了。对于那些有同样问题的人,由于 Android 的 Webviews 优化,我决定继续这样做,即使它不是无头的。还可以覆盖资源加载以忽略所有图像和 css 以改善一些加载时间,因为这些对于不可见的视图来说不是必需的。 JS 将由注入到 webview 的观察者处理。
  • 太棒了,艾伦!祝你的项目好运:)