使用Groovy从嵌套在JSON响应中的HTML页面提取href中的key参数值
解决HTML解析报错并提取URL中key参数的方案
我之前也碰到过一模一样的问题——用XmlSlurper解析邮件里的HTML经常因为格式不规范报错,毕竟邮件HTML大多是各种编辑器生成的,很难严格符合XML标准。下面是我验证过的可行方案,用专门的HTML解析库Jsoup来处理,轻松提取目标key值:
步骤1:引入Jsoup依赖
Groovy里可以直接用@Grab快速引入依赖,如果是项目环境的话,Gradle/Maven添加对应依赖即可:
@Grab('org.jsoup:jsoup:1.17.2') import org.jsoup.Jsoup import org.jsoup.nodes.Document import groovy.json.JsonSlurper
步骤2:解析JSON获取HTML内容
这部分你已经实现了,我再贴出来确保流程完整:
// 替换成你的实际Graph API返回的JSON字符串 def jsonResponse = '''{"value":[{"body":{"content":"<html><body><a href='https://abc.xyz123.com?key=GBsG3gBoI4YV+fSfejXCbw6vgG6m4OCU7Czfn3PAKXtxVI9Ex'>登录</a></body></html>"}}]}''' def jsonSlurper = new JsonSlurper() def jsonData = jsonSlurper.parseText(jsonResponse) def htmlContent = jsonData.value[0].body.content
步骤3:解析HTML并提取key参数
用Jsoup解析HTML,它会自动处理不规范的标签,然后定位目标a标签,提取href并解析key:
// 解析HTML文档 Document doc = Jsoup.parse(htmlContent) // 定位目标a标签:这里用href包含abc.xyz123.com来筛选,你可以根据实际情况调整(比如链接文本、class属性等) def targetLink = doc.select("a[href*=abc.xyz123.com]").first() if (targetLink) { String href = targetLink.attr("href") // 提取key参数值:先分割出key=后面的部分,再处理可能存在的其他参数 def keyValue = href.split("key=")[1].split("&")[0] println "提取到的key值:${keyValue}" } else { println "未找到包含目标链接的a标签" }
为什么不用XmlSlurper?
XmlSlurper依赖SAXParser,它是为严格的XML设计的,而邮件HTML经常有未闭合的标签、属性省略引号、大小写不规范等问题,这些都会触发解析错误。Jsoup是专门针对HTML开发的解析器,会自动修复这些不规范的语法,完美适配邮件这类场景。
额外提示
如果邮件里有多个a标签,你可以优化选择器来精准定位,比如:
- 根据链接文本:
doc.select("a:contains(点击登录)") - 根据class属性:
doc.select("a.login-link") - 组合多个条件:
doc.select("a[href*=abc.xyz123.com]:contains(登录)")
内容的提问来源于stack exchange,提问作者rAJ
相关产品推荐
相关产品推荐

