使用Jsoup遍历div.g元素,实现所有标题在JList中逐个展示
解决Jsoup提取所有目标标题并展示在JList的问题
我明白你遇到的问题了——你的当前代码只能拿到最后一个div.g对应的标题,核心问题有两个:一是循环里每次都用新标题覆盖了title变量,最后只把最后一次的结果加入了列表模型;二是原代码用getElementsByTag("a")会误拿到页面里其他无关的a标签(比如带图片的a.picture),可能导致提取的文本不准确。
下面是修正后的完整代码,我会标注关键修改点:
String url = "http://www.google.com/search?q=example&tbm=nws&source=lnms"; try { // 1. 提前初始化列表模型,放在循环外部 DefaultListModel<String> listModel = new DefaultListModel<>(); Document doc = Jsoup.connect(url).userAgent("Chrome").timeout(5000).get(); Elements gDivs = doc.select("div.g"); for (Element gDiv : gDivs) { // 2. 使用精确选择器,仅定位class为title的a标签 String title = gDiv.select("a.title").text(); // 3. 每次提取到标题就直接加入列表模型 listModel.addElement(title); } // 最后将填充好的模型绑定到JList jList.setModel(listModel); } catch (IOException ex) { Logger.getLogger(MainUI.class.getName()).log(Level.SEVERE, null, ex); }
关键修改说明:
- 调整列表模型的生命周期:把
DefaultListModel的创建移到循环之前,这样可以在循环过程中持续添加元素,而不是最后仅添加单个结果。 - 精准定位目标元素:用
select("a.title")替代getElementsByTag("a"),确保只提取我们需要的、class为title的a标签文本,避免混入其他无关内容。 - 循环内实时添加元素:在每次循环提取到标题后,立刻调用
listModel.addElement(title),这样所有符合条件的标题都会被依次加入到列表中。
修改后,你的JList就能完整展示所有从div.g下提取到的a.title文本,和你期望的输出完全一致。
内容的提问来源于stack exchange,提问作者user7146946
相关产品推荐
相关产品推荐

