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
相关产品推荐
相关产品推荐

