推荐使用Jsoup解析HTML再提取邮箱和链接,因其能自动处理编码、标签嵌套与HTML实体;若用IO流,须规范编码、清理script/style标签及注释后再正则匹配。

直接用IO流读取网页内容再配合正则表达式提取邮箱和链接,虽可行但存在明显局限:HTML结构复杂、转义干扰多、编码不一致易出错,且无法处理JavaScript动态渲染的内容。真正高效的做法是分两步——先用可靠方式获取纯净文本(或DOM结构),再用精准正则提取目标信息。
优先用Jsoup解析HTML,再提取邮箱和链接
Jsoup能自动处理编码、标签嵌套、HTML实体和注释,比原始IO流+正则更健壮。
- 添加Maven依赖:
jsoup 1.17.2 - 加载页面并获取所有超链接:
Document doc = Jsoup.connect("https://example.com").get();
Listurls = doc.select("a[href]").eachAttr("href"); - 提取邮箱:遍历文本节点 + 正则匹配,避免在href或script中误抓
Pattern emailPat = Pattern.compile("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}");
doc.body().text().lines().forEach(line -> emailPat.matcher(line).results().forEach(m -> System.out.println(m.group())));
若必须用IO流,务必先规范编码和清理HTML
原始IO流读取容易因charset缺失导致乱码,进而让正则失效。
- 用URLConnection明确指定UTF-8,并读取响应头中的Content-Type确认编码
- 读取后先用正则粗略剥离script/style标签和注释:
html = html.replaceAll("(?i)]*>.*?\1>", "");
html = html.replaceAll("", ""); - 再提取纯文本(去除所有标签):html.replaceAll("]*>", " ").replaceAll("\s+", " "),最后在这段文本上跑邮箱/链接正则
邮箱和链接正则要兼顾准确与安全
网上流传的“万能邮箱正则”往往过度宽泛(如匹配a@b.c)或过于严格(漏掉user+tag@domain.co.uk)。推荐实用级写法:
- 邮箱:[a-zA-Z0-9]([a-zA-Z0-9._%-]*[a-zA-Z0-9])?@([a-zA-Z0-9]([a-zA-Z0-9.-]*[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}
(允许点号、下划线、百分号、加号在用户名中,禁止开头结尾为特殊字符) - 链接(相对/绝对):https?://[^s">]+|[a-zA-Z][a-zA-Z0-9+.-]*://[^s">]+|/[-\w./?=%]+
(覆盖http/https、ftp等协议,以及常见相对路径)
补充建议:去重、校验与防反爬
抓取结果常含重复、无效或伪装数据,需后处理。
- 用HashSet自动去重;对邮箱做基础校验(如检查域名MX记录需额外库,简单场景可跳过)
- 链接建议用
new URL(url).toURI()尝试构造,捕获MalformedURLException过滤非法格式 - 加请求头(User-Agent、Accept)模拟浏览器;控制请求频率(Thread.sleep(1000));必要时用CookieStore维持会话










