You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何从HTML响应提取200状态码后的URL?

解决方案:直接基于原始HTML字符串提取URL

你的问题出在使用Jsoup解析后的document.text()来匹配正则——Jsoup在解析HTML时会自动清理、合并文本内容(比如去掉HTML标签、注释,压缩连续空白字符),这会破坏原始HTML中"200 + 长URL"的结构,导致正则匹配不到目标内容。

正确的做法是直接用接口返回的原始HTML字符串进行正则匹配,跳过Jsoup解析这一步(如果你不需要处理HTML结构的话)。

修改后的代码如下:

override suspend fun logInViaGoogle(): String? {
    return try {
        withContext(Dispatchers.IO) {
            val response = apiService.requestGoogleAuthWindow()
            if (response.isSuccessful) {
                val htmlContent = response.body()?.string() ?: return@withContext null
                Log.d("MyOwnUrlHtml", "html: $htmlContent")
                
                // 直接用原始HTML字符串提取URL,无需Jsoup解析
                val url: String? = extractUrlAfter200(htmlContent)

                Log.d("MyOwnUrl", url ?: "URL is null")
                url
            } else {
                null
            }
        }
    } catch (e: retrofit2.HttpException) {
        throw e
    } catch (e: Exception) {
        null
    }
}

fun extractUrlAfter200(htmlContent: String): String? {
    // 匹配"200"后面的URL,允许200和URL之间有多个空格/制表符
    val pattern = "200\\s+(https?://\\S+)".toRegex(RegexOption.DOT_MATCHES_ALL)
    val matchResult = pattern.find(htmlContent)
    return matchResult?.groups?.get(1)?.value
}

关键修改点:

  • 移除了Jsoup解析步骤,直接传入原始htmlContent给提取方法
  • 正则表达式调整为200\\s+(https?://\\S+),\\s+匹配一个或多个空白字符(包括空格、制表符),避免因为空格数量导致匹配失败
  • 添加RegexOption.DOT_MATCHES_ALL,确保.可以匹配换行符(如果200和URL不在同一行的话)

如果你的目标URL确实存在于原始HTML中,这种方法应该能准确提取到。如果还是匹配不到,可以检查htmlContent的日志,确认"200"和目标URL的具体格式,再微调正则表达式。

内容的提问来源于stack exchange,提问作者Alex20280

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:42:46