java - Jsoup:无法选择 tbody id 中的所有行

标签 java dom jsoup

我有这个 html 文件,它已经从论坛中抓取并保存了。我想从爬网数据中提取所有线程标题,问题是它设法输出一些线程标题,但不是全部,而是跳过一些线程标题。

我已附上实际 HTML 的示例。注意:“threadbits_forum_2”2 是运行编号

<tbody id="threadbits_forum_2">
<tr>
    <td>Thread1</td>
</tr>
<tr>
    <td>Thread2</td>
</tr>
<tr>
    <td>Thread3</td>
</tr>
<tr>
    <td>Thread4</td>
</tr>
.
.
.
.
</tbody>

Java 编码:

        Document doc = Jsoup.parse(html);

        Elements threadsList = doc.select("tbody[id^=threadbits_forum]").select("tr");
        System.out.println(threadsList.toString());

结果:

 <tbody id="threadbits_forum_2">
<tr>
    <td>Thread2</td>
</tr>
<tr>
    <td>Thread4</td>
</tr>

有什么解决方法可以获取所有线程标题吗?

感谢您阅读我的帖子。

基思

最佳答案

您需要使用 for() 语句来扫描所有名称。

Elements threadsList = doc.select("tr");
for(thread : threadsList){
      String title;
      Elements titles = thread.select("td");
      title = titles.text();
}

如果每个属性都有属性,那会很有帮助。因此,它不仅仅是 tr 或 td,而是类似 select("tr[class=threadClass]") 的东西。我假设您只是没有在每个属性中发布属性。

尝试类似的事情。

编辑:我将尝试解释 JSoup 的工作原理,它可能会让您更好地了解如何使用它进行编码。当您创建 Elements 对象时,您可以在 select() 方法中指定您希望它扫描哪些元素。因此它将扫描所有 HTML,查找其中包含 tr 或 td 的任何元素。然后它将它们放入 Elements 数组中。然后,您必须使用 for() 语句扫描该数组,以从这些元素中获取您想要的信息。当您仅指定不带任何属性的元素时,它将检索带有 tr 或 td 元素的 HTML 的任何部分。这通常会导致错误,因为网站上通常有多个区域包含这些元素,因此它会返回比您想要的更多的内容。

关于java - Jsoup:无法选择 tbody id 中的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660936/

相关文章:

java - 通过线程将变量从客户端发送到服务器

Java删除转义双引号

javascript - 如何在不使用 "style=white-space: pre"的情况下制作带有新行的文本节点?

JavaScript "takeown"函数?

java - 通过 Jsoup 登录 Facebook

Java - 无法从元素转换为字符串

java - 如何修复 "java.lang.OutOfMemoryError at sun.misc.Unsafe.allocateMemory(Native Method)"?

java - 递归和递归方法

javascript - 如何在元素完成渲染后立即运行函数?

java - jSoup 从 <td><span> 类获取文本