我有这个已经在论坛中抓取并保存的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>
获取所有主题标题的任何解决方法?
感谢您阅读我的帖子。
基思
答案 0 :(得分:2)
您需要使用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的任何部分。这通常会导致错误,因为在站点上通常有多个区域包含这些元素,因此它将返回超出您想要的值。
答案 1 :(得分:0)
您的查询要求错误的tbody id。在html中,tbody的id为&#34; threadbits_forum_2&#34;并且您的代码正在搜索&#34; threadbits_forum&#34;的ID。我建议进行以下更改:
Element tbody = doc.getElementById("threadbits_forum_2");
Elements trs = tbody.getElementsByTag("tr");
//verify trs.size() is correct
for (Element tr : trs) {
//do whatever you want
}