使用Jsoup解析MHTML/HTML页面时,如何去除或转义=3D类垃圾值?
解决Jsoup解析离线HTML出现=3D等垃圾值的问题
你遇到的=3D、=3d&&quote这类垃圾值,本质是Quoted-Printable编码的残留,通常是网页保存过程中(比如从邮件导出、特殊网页保存)的编码遗留:=3D是等号(=)的Quoted-Printable编码,&&quote是HTML实体转义错误叠加的结果。以下是几种解决方法:
方法一:用Java邮件工具类解码Quoted-Printable
Java自带的javax.mail.internet.MimeUtility可以直接解码这种编码,先解码HTML内容再交给Jsoup解析,是最稳妥的方式:
import javax.mail.internet.MimeUtility; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException; public class HtmlCleaner { public static void main(String[] args) throws IOException { // 读取离线HTML文件内容 File htmlFile = new File("your-offline-page.html"); BufferedReader reader = new BufferedReader(new FileReader(htmlFile)); StringBuilder rawContent = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { rawContent.append(line); } reader.close(); // 解码Quoted-Printable编码 String decodedContent = MimeUtility.decodeText(rawContent.toString()); // 用Jsoup解析处理后的干净内容 Document doc = Jsoup.parse(decodedContent); // 后续数据提取操作,比如获取正文文本 String cleanText = doc.body().text(); System.out.println(cleanText); } }
如果项目没有引入Java Mail依赖,需要添加:
<!-- Maven依赖 --> <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency>
方法二:手动替换编码残留(无依赖)
如果不想引入额外依赖,可以直接通过字符串替换处理已知的编码残留:
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.File; import java.io.IOException; public class HtmlCleaner { public static void main(String[] args) throws IOException { // 先读取原始HTML Document rawDoc = Jsoup.parse(new File("your-offline-page.html"), "UTF-8"); String rawHtml = rawDoc.html(); // 清理Quoted-Printable残留和错误实体 String cleanedHtml = rawHtml.replaceAll("=3D", "=") .replaceAll("(?m)^=\\s*$", "") // 移除行尾的换行标记= .replaceAll("&&quote;", """); // 修复叠加的引号实体 // 重新解析清理后的内容 Document cleanedDoc = Jsoup.parse(cleanedHtml); String cleanText = cleanedDoc.body().text(); System.out.println(cleanText); } }
方法三:用Apache Commons Codec解码
Apache Commons Codec库的QuotedPrintableCodec也可以处理Quoted-Printable编码,用法如下:
import org.apache.commons.codec.net.QuotedPrintableCodec; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; public class HtmlCleaner { public static void main(String[] args) throws IOException, UnsupportedEncodingException { File htmlFile = new File("your-offline-page.html"); BufferedReader reader = new BufferedReader(new FileReader(htmlFile)); StringBuilder rawContent = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { rawContent.append(line); } reader.close(); // 解码Quoted-Printable QuotedPrintableCodec codec = new QuotedPrintableCodec("UTF-8"); String decodedContent = codec.decode(rawContent.toString()); // Jsoup解析 Document doc = Jsoup.parse(decodedContent); System.out.println(doc.body().text()); } }
对应的Maven依赖:
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.15</version> </dependency>
内容的提问来源于stack exchange,提问作者Kunanj Pradhan
相关产品推荐
相关产品推荐

