You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:15:51