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

