如何使用JSoup保留纯文本页面换行?以robots.txt为例
解决JSoup抓取robots.txt内容合并为一行的问题
你遇到的问题其实是因为JSoup本质是HTML/XML解析器,它会把纯文本格式的robots.txt当成HTML来处理——HTML里的换行、多余空白会被自动合并成单个空格,所以最终拿到的body内容就是一行。要解决这个问题,我们需要绕开JSoup的HTML解析逻辑,直接获取robots.txt的原始纯文本内容,再逐行处理。
步骤1:获取robots.txt的原始纯文本
使用JSoup的connect()方法时,加上ignoreContentType(true),这样JSoup就不会因为内容类型不是HTML而报错,而是直接返回原始的响应内容:
import org.jsoup.Connection; import org.jsoup.Jsoup; public class RobotsParser { public static void main(String[] args) throws Exception { String targetUrl = "https://example.com/robots.txt"; // 建立连接并忽略内容类型,获取原始响应 Connection.Response response = Jsoup.connect(targetUrl) .ignoreContentType(true) .execute(); // 获取原始的纯文本内容 String robotsRawContent = response.body(); } }
步骤2:将内容分割为单独的行
不同系统的换行符可能是\n(Unix/Linux)或\r\n(Windows),所以用正则表达式\\r?\\n来分割可以兼容所有情况:
// 分割成每行 String[] lines = robotsRawContent.split("\\r?\\n"); // 遍历每行验证效果 for (String line : lines) { System.out.println(line); }
步骤3:逐行执行正则表达式操作
现在你可以针对每行内容做正则处理了,比如提取所有Disallow规则,或者过滤注释行:
示例:提取所有Disallow路径
import java.util.regex.Matcher; import java.util.regex.Pattern; // 定义匹配Disallow规则的正则(忽略大小写) Pattern disallowPattern = Pattern.compile("^Disallow:\\s*(.*)$", Pattern.CASE_INSENSITIVE); for (String line : lines) { String trimmedLine = line.trim(); // 跳过空行和注释行 if (trimmedLine.isEmpty() || trimmedLine.startsWith("#")) { continue; } // 匹配Disallow规则 Matcher matcher = disallowPattern.matcher(trimmedLine); if (matcher.find()) { String disallowedPath = matcher.group(1); System.out.println("找到禁止爬取的路径: " + disallowedPath); } }
关键注意点
- 不要直接用
Jsoup.connect(url).get().body().text(),因为这个方法会触发JSoup的HTML解析,自动合并空白和换行。 ignoreContentType(true)是必须的,否则JSoup会因为robots.txt是text/plain类型而抛出异常。
内容的提问来源于stack exchange,提问作者Eumcoz
相关产品推荐
相关产品推荐

