如何用Jsoup解析以[email protected]形式呈现的受保护邮箱地址
嘿,刚好我之前处理过类似的Jsoup解析加密邮箱的问题,来给你一步步拆解解决方案!
首先得明确:你遇到的[email protected]是网站为了防爬虫做的邮箱保护手段,不同网站的实现逻辑不一样,咱们得针对性处理,下面是几种最常见的场景和解决方法:
1. 邮箱被拆分成多个DOM元素(CSS拼接显示)
很多网站会把真实邮箱拆成「用户名」「@」「域名」三部分,分别放在不同的子标签里,然后通过CSS让它们在页面上显示成完整的邮箱,但直接用elements.select(".email").text()只能拿到页面显示的占位符[email protected]。
举个例子,页面的真实DOM结构可能是这样的:
<span class="email"> <span class="email-user">user</span> <span class="email-at" style="visibility:hidden;">@</span> <span class="email-domain">example.com</span> </span>
解决方法:直接提取各部分的文本再拼接:
// 先拿到邮箱容器元素 Element emailContainer = doc.selectFirst(".email"); // 提取用户名和域名部分 String username = emailContainer.select(".email-user").text(); String domain = emailContainer.select(".email-domain").text(); // 拼接成真实邮箱 String realEmail = username + "@" + domain;
如果@是通过CSS伪元素(比如::before)插入的,Jsoup拿不到伪元素内容,这时候直接按「用户名+@+域名」的规律拼接就行,大部分场景都适用。
2. 真实邮箱藏在元素属性里
有些网站会把真实邮箱放在元素的自定义属性中(比如data-email、data-original),页面显示的[email protected]只是占位符。
比如DOM结构:
<span class="email" data-email="user@example.com">[email protected]</span>
解决方法:直接读取对应属性的值:
String realEmail = doc.selectFirst(".email").attr("data-email");
3. 邮箱需要JS动态解码
如果网站用JS对邮箱做了加密(比如ASCII编码、Base64或者自定义算法),然后在页面加载时动态渲染成真实邮箱,这时候Jsoup静态解析只能拿到占位符,因为它不执行JS。
解决方法:结合支持JS渲染的工具(比如HtmlUnit或Selenium)先让页面执行JS,再用Jsoup解析渲染后的内容。
以HtmlUnit为例,示例代码:
// 初始化支持JS的WebClient WebClient webClient = new WebClient(BrowserVersion.CHROME); webClient.getOptions().setJavaScriptEnabled(true); webClient.getOptions().setThrowExceptionOnScriptError(false); // 忽略无关的JS错误 webClient.getOptions().setCssEnabled(false); // 加载目标页面并等待JS执行完成 HtmlPage page = webClient.getPage("你的目标网页URL"); webClient.waitForBackgroundJavaScript(1000); // 等待1秒让JS跑完 // 把渲染后的页面转成Jsoup的Document对象 Document doc = Jsoup.parse(page.asXml()); // 现在再提取邮箱就能拿到真实地址了 String realEmail = doc.select(".email").text();
通用排查思路
如果以上方法都不适用,你可以按这个步骤自己排查:
- 打开浏览器开发者工具(F12),找到显示
[email protected]的元素,查看它的真实DOM结构; - 检查元素的所有属性,看有没有藏着真实邮箱;
- 查看页面的JS代码,找有没有解密邮箱的逻辑(比如搜索
email、decode等关键词); - 模仿JS的解密逻辑,在Java里实现对应的解码方法。
内容的提问来源于stack exchange,提问作者Tonton

