【问题标题】:JSoup not showing all the html in Java (td and tr tags missing)JSoup 未显示 Java 中的所有 html(缺少 td 和 tr 标签)
【发布时间】:2015-08-10 04:11:47
【问题描述】:

我无法获取标签下的所有 html 代码。这是我当前的代码:

Document document = Jsoup.connect("http://stackoverflow.com/questions/2971155/what-is-the-fastest-way-to-scrape-html-webpage-in-android").get();
Elements desc = document.select("tr");

System.out.println(desc.toString());

这是针对那个问题的,我正在尝试从问题的描述中获取文本。但是我没有得到某些 tr 或 td 标签,例如问题中的标签。这是我想要获取的 td 标签:

<td class="postcell">

在该标签下是实际的帖子。现在,当我打印出我实际得到的内容时,我得到了大量空的 td 标签和一些 cmets,但不是实际的帖子。

 <tr id="comment-37956942" class="comment ">
 <td>
 <table>
 <tbody>
 <tr>
  <td class=" comment-score"> &nbsp;&nbsp; </td>
  <td> &nbsp; </td>
  </tr>
</tbody>
</table> </td>
 <td class="comment-text">
<div style="display: block;" class="comment-body">
 <span class="comcopy">You shouldn't parse HTML with regexes: <a   href="http://blog.codinghorror.com/parsing-html-the-cthulhu-way/" rel="nofollow">blog.codinghorror.com/parsing-html-the-cthulhu-way</a></span> –&nbsp;
 ﹕    <a href="/users/25612/motob%c3%b3i" title="469 reputation" class="comment-user">motobói</a>

它继续使用空的 td 和 tr 标签。我找不到真正的问题。有人知道为什么会这样吗?

基本上,我只想要问题帖子中的文本,我不知道如何获取它,所以如果有人能告诉我如何获取文本会很好。

【问题讨论】:

  • 听起来像是动态加载的。如果是这种情况,您将无法使用 jsoup 获取内容。除此之外,get() 方法返回一个Document,所以你不需要创建另一个Document
  • 是的,我用文档内容修复了代码,我只是在测试内容。不过,动态加载是什么意思?我仍然在 html 中得到一些 cmets。我只想知道如何从链接中的问题中获取文本。
  • 试试这个选择器td.postcell(就像你说的那样),如果你什么也没得到是因为帖子是动态加载的(例如ajax调用)。
  • 是的,我之前尝试过,它什么也没给我。 “它正在动态加载”是什么意思?这是否意味着我无法获得职位?因为如果我使用“div”选择器,那么帖子就会显示出来(连同其他所有内容,因此很难将其过滤到帖子中)。

标签: android html jsoup


【解决方案1】:

Jsoup 是一个解析器。这意味着它不能执行任何可以生成 html 的 javascript 代码。当您遇到此问题时,检索该内容的唯一方法是通过 headless browser,其中包括一个 javascript 引擎。一个流行的图书馆是selenium webdriver

为了确定您尝试解析的内容是在服务器中(静态内容)还是在客户端(动态内容-javascript 生成)中生成的,您可以执行以下操作:

  1. 访问要解析的页面
  2. Ctrl + U

上述步骤将打开一个新选项卡,其中包含 jsoup 接收的内容。如果你需要的内容不存在,那么它是由javascript生成的。

按照步骤并搜索内容。如果它在那里,但 jsoup 仍然存在问题,那么很可能是该站点认为您是机器人或移动设备。尝试设置桌面浏览器的userAgent,看看会发生什么。

Document document = Jsoup.connect("http://stackoverflow.com/questions/2971155/what-is-the-fastest-way-to-scrape-html-webpage-in-android").userAgent("USER_AGENT_HERE").get();

最重要的是,当网站公开 API 以供用户以编程方式提取信息时,最好只使用它。 Stackoverflow has an API available

【讨论】:

  • 谢谢,我通过 CTRL+U 看到帖子不是由 javascript 生成的。我接受了你的建议并使用了用户代理,我从这篇文章中得到了这个用户代理:stackoverflow.com/questions/6581655/…(第三个答案是 .execute 和其他东西)。现在我可以看到帖子单元格了。
猜你喜欢
  • 2015-02-11
  • 2015-04-12
  • 2012-04-16
  • 2018-07-11
  • 2015-02-06
  • 2012-10-30
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多