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

禁用JSoup空白字符移除失败,HTML输出测试断言不匹配求助

解决JSoup解析时的空格合并与HTML标签问题

问题1:text()方法合并多空格导致断言失败

JSoup的text()方法默认遵循HTML规范,会将连续空白字符(空格、换行、制表符等)合并为单个空格,这是核心设计逻辑。要保留原始多空格,需直接提取文本节点的原始内容,而非使用text()方法:

// 直接获取strong元素下文本节点的原始内容
String sp1 = testDoc.select("span#sp1 strong").first().textNodes().get(0).getWholeText();
assertThat(sp1).isEqualTo("ABC  123");

如果不确定子元素结构,可遍历所有文本节点拼接原始内容:

StringBuilder sb = new StringBuilder();
Element sp1Element = testDoc.select("span#sp1").first();
for (Node node : sp1Element.childNodes()) {
    if (node instanceof TextNode) {
        sb.append(((TextNode) node).getWholeText());
    } else if (node instanceof Element) {
        // 递归处理子元素的文本节点
        for (Node child : node.childNodes()) {
            if (child instanceof TextNode) {
                sb.append(((TextNode) child).getWholeText());
            }
        }
    }
}
String sp1 = sb.toString();
assertThat(sp1).isEqualTo("ABC  123");

问题2:html()返回含子标签内容导致断言失败

html()方法的作用是返回元素内部的完整HTML结构(包含所有子标签),而非纯文本。若需获取元素内的纯文本,应使用文本提取逻辑:

// 用保留空格的方式获取span#sp1内的纯文本
String spHtmlContent = testDoc.select("span#sp1 strong").first().textNodes().get(0).getWholeText();
assertThat(spHtmlContent).isEqualTo("ABC  123");

关于prettyPrint(false)的说明

该设置仅控制HTML输出是否格式化(如换行、缩进),不会改变text()和html()方法的文本处理逻辑,因此对当前断言问题无帮助。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:36:14