JSoup技术实现:如何从指定div内的列表提取链接?
用JSoup提取页面链接:基础方法与范围限定技巧
嘿,我来帮你搞定JSoup提取链接的问题,尤其是你提到的限定在特定div内列表链接的场景!咱分两部分来讲,结合你的代码做优化说明。
一、提取整个页面的所有链接
如果要抓取页面上所有可点击的链接,JSoup的选择器可以一步到位:
// 先解析页面得到Document对象 Document doc = Jsoup.parse(input, "UTF-8"); // 选中所有带href属性的<a>标签 Elements allLinks = doc.select("a[href]"); // 遍历输出链接文本和地址 for (Element link : allLinks) { String linkText = link.text(); // 用abs:href获取绝对URL,避免相对路径的问题 String linkUrl = link.attr("abs:href"); System.out.println("链接文本:" + linkText + " | 链接地址:" + linkUrl); }
这里的a[href]选择器会精准匹配所有包含href属性的<a>标签,abs:href是JSoup的贴心功能——自动根据页面的基础URL把相对路径转换成绝对路径,后续用起来更省心。
二、限定在特定div内的列表链接(你的核心需求)
你的代码已经在定位div.side_categories了,接下来要提取这个div里列表中的链接,其实可以用更简洁的链式选择器,一步定位到目标,不需要分步取ul、li。
优化后的代码示例
private void basicJSoup() throws Exception { properties.loadFromXML(App.class.getResourceAsStream("/properties.xml")); LOG.fine(properties.toString()); URI inputURI = new URI(properties.getProperty("html_input")); File input = new File(inputURI); Document doc = Jsoup.parse(input, "UTF-8"); // 方法1:直接用链式选择器定位目标链接 Elements targetLinks = doc.select("div.side_categories ul li a[href]"); // 方法2:先定位到目标div,再在其内部选择链接(适合页面有多个同class div的场景) // Element sideCategories = doc.select("div.side_categories").first(); // Elements targetLinks = sideCategories.select("ul li a[href]"); // 遍历输出分类名称和链接 for (Element link : targetLinks) { String categoryName = link.text(); String categoryUrl = link.attr("abs:href"); LOG.info("分类名称:" + categoryName); LOG.info("分类链接:" + categoryUrl); } }
关键选择器解释
div.side_categories ul li a[href]这个选择器的逻辑是:
- 先找到class为
side_categories的<div>标签 - 选中该div内部的所有
<ul>列表 - 再选中ul里的所有
<li>项 - 最后定位到li中带href属性的
<a>标签,精准锁定你要的列表链接
额外小技巧
- 如果要排除无效链接(比如
javascript:void(0)这类),可以给选择器加过滤:div.side_categories ul li a[href]:not([href^=javascript]),这样就能跳过以javascript开头的无效链接。 - 如果你需要的是相对路径,把
attr("abs:href")换成attr("href")即可。
内容的提问来源于stack exchange,提问作者Thufir
相关产品推荐
相关产品推荐

