
NetDiscovery数据提取完全指南CSS、Xpath、JsonPath与ExtractBy注解5种选择器一网打尽【免费下载链接】NetDiscoveryNetDiscovery 是一款基于 Vert.x、RxJava 2 等框架实现的通用爬虫框架/中间件。项目地址: https://gitcode.com/gh_mirrors/ne/NetDiscoveryNetDiscovery 是一款基于 Vert.x 和 RxJava 2 实现的通用爬虫框架内置了一套强大又简洁的数据提取体系。本文带你快速上手 NetDiscovery 数据提取的 5 种核心选择器CSS 选择器、Xpath 选择器、JsonPath 选择器、正则选择器以及 ExtractBy 注解帮你用最少的代码从网页和 JSON 中精准抓取目标数据。如图爬虫数据流为 request → downloader →parser→ pipeline。数据提取就发生在 parser 这一环解析器把页面内容交给选择器提取出的字段存入ResultItems再交由 Pipeline 输出。为什么选择器是爬虫的核心能力爬取到页面只是第一步真正决定爬虫质量的是能不能把数据干净地抠出来。NetDiscovery 的解析器统一遵循 Parser.java 定义的接口public interface Parser { void process(Page page); // 解析 Page结果放入 ResultItems }所有提取结果最终都放进page.getResultItems()后续 Pipeline 可直接消费无需关心具体用了哪种选择器。5种选择器速查NetDiscovery数据提取全景选择器的统一抽象是 Selector.javapublic interface Selector { String select(String text); // 提取单个结果取第一个 ListString selectList(String text); // 提取全部结果 }常用选择器由 Selectors.java 一行代码创建选择器创建方式适用场景CSSSelectors.$(div#id .cls)HTML 结构清晰、标签语义化XPathSelectors.xpath(//div[idx]/a/text())需要层级、谓词、轴操作正则Selectors.regex((\\d).price)文本模式固定、无 DOM 结构JsonPathjson.jsonPath($.data[0].name)接口返回 JSON / JSONPExtractBy 注解字段上加注解声明式解析字段即规则1. CSS 选择器提取 HTML 数据最快方式基于 Jsoup 实现见 CssSelector.java支持写属性名的重载可指定提取href、src等任意属性也支持text、allText、innerHtml等保留关键字// 提取元素文本 String title page.getHtml() .$(Selectors.$(.product h1, text)).get(); // 提取所有商品链接 ListString urls page.getHtml() .$(Selectors.$(ul.gl-warp li a, href)).all();CSS 选择器写法简短、可读性强是提取 HTML 结构数据的首选。2. Xpath 选择器复杂层级结构的克星基于 Xsoup 实现见 XpathSelector.java。当页面结构深、需要条件筛选如第 N 个兄弟节点、包含某文本的节点时XPath 比 CSS 更灵活// 提取所有商品标题 ListString names page.getHtml() .xpath(//div[idJ_goodsList]/ul/li/h2/em/a/text()).all();在页面没有 class 命名规律、只能靠层级定位时XPath 是唯一解法。3. JsonPath 选择器接口数据一键解析越来越多的页面数据来自 AJAX 接口。NetDiscovery 提供了 Json.java 工具类jsonPath()按 JsonPath 表达式提取toObject()/toList()整个 JSON 直接转 Java 对象removePadding()处理 JSONP 包裹// 提取接口返回中的价格字段 String price page.getHtml() .regex(var priceData (.*?);, 1).get(); Json json new Json(price); String name json.jsonPath($.data.product.name).get();4. 正则选择器无结构文本的兜底方案RegexSelector.java 默认忽略大小写并支持跨行匹配有捕获组时默认取第 1 组也可显式指定组号// 从一段 HTML 片段中抠出手机号 String phone page.getHtml() .regex(1[3-9]\\d{9}, 0).get();正则适合结构不稳定但模式固定的场景例如验证码样式文本、时间戳等。5. ExtractBy 注解声明式数据提取不想写过程代码NetDiscovery 提供了 ExtractBy.java 注解把字段 → 提取规则直接写在 POJO 上public class BookPage { ExtractBy.XPath(//div[idbook]/h1/text()) String title; ExtractBy.XPath(//div[idbook]/p[classauthor]/text()) String author; ExtractBy.Regex(\price\\\s*:\\s*\([\\d.])\) String price; }继承 AnnotationParser.java 后解析器会自动扫描所有带注解的字段字段是集合类型就执行selectList否则执行select结果按字段名自动写入ResultItems。规则与数据模型同文件维护重构时一目了然非常适合字段较多的结构化页面。组合技and / or 组合选择器NetDiscovery 还支持逻辑组合见 AndSelector.java 与 OrSelector.java// AND前一个选择器的结果作为后一个的输入链式过滤 Selectors.and(Selectors.$(div.content), Selectors.regex(\\d元)); // OR任一选择器命中即返回多源兜底 Selectors.or(Selectors.xpath(//h1/text()), Selectors.$(meta[propertyog:title], content));实战中常用or做容错首选 XPath 拿不到时回退到 CSS 或正则显著提高抓取成功率。选择器选型建议3步定方案页面有清晰 class/id 结构→ 优先 CSS 选择器开发最快结构层级复杂或靠位置定位→ 用 XPath配合text()、谓词精确打击数据来自接口 JSON→ 直接 JsonPath 或toObject()转实体字段多、想声明式管理→ 用 ExtractBy 注解让 POJO 自带提取规则以上都不适用→ 正则兜底并优先配合or组合做容错。更多爬虫用法可参考示例目录example/ 下的 JDSpider.java 展示了解析器 管道的完整协作方式。掌握这 5 种选择器你就能覆盖绝大多数 NetDiscovery 数据提取场景把数据干净地送进你的 Pipeline。【免费下载链接】NetDiscoveryNetDiscovery 是一款基于 Vert.x、RxJava 2 等框架实现的通用爬虫框架/中间件。项目地址: https://gitcode.com/gh_mirrors/ne/NetDiscovery创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考