如何使用Jsoup循环遍历新闻表格获取标题与评分?
解决Jsoup遍历HN新闻表格获取标题和评分的问题
问题根源
你之前的选择器#hnmain > tbody > tr:nth-child(3) > td > table选中的是整个新闻表格,所以elements集合里只有1个元素,自然没法循环处理单条新闻。
正确实现思路
HN的每条新闻由两组<tr>组成:
- 带
class="athing"的行:存储新闻标题 - 紧随其后的兄弟
<tr>:存储评分、作者等信息 - 最后是带
class="spacer"的分隔行(可忽略)
核心逻辑:先选中所有athing行,再逐个获取对应的评分行。
完整代码示例
import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.util.ArrayList; import java.util.List; public class HNScraper { public static void main(String[] args) { // 假设document已经是解析好的HN页面文档 Document document = ...; List<String> newsData = new ArrayList<>(); // 选中所有新闻标题行 Elements titleRows = document.select("#hnmain > tbody > tr:nth-child(3) > td > table tr.athing"); for (Element titleRow : titleRows) { // 提取标题 String title = titleRow.select("td.title span.titleline a").text(); // 获取对应的评分行(标题行的下一个兄弟tr) Element scoreRow = titleRow.nextElementSibling(); String rating = ""; if (scoreRow != null) { Element scoreElement = scoreRow.selectFirst("span.score"); rating = scoreElement != null ? scoreElement.text() : "无评分"; } newsData.add(title); newsData.add(rating); } // 输出测试 for (int i = 0; i < newsData.size(); i += 2) { System.out.println("标题:" + newsData.get(i) + " | 评分:" + newsData.get(i+1)); } } }
关键细节说明
tr.athing:精准定位每条新闻的标题行nextElementSibling():获取标题行的下一个兄弟元素,也就是存储评分的行- 空值处理:部分新发布的新闻可能还没有评分,需要判断
scoreElement是否为null,避免空指针异常
内容的提问来源于stack exchange,提问作者Artem Gareev
相关产品推荐
相关产品推荐

