You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2023/09/22 16:23:40 UTC

[tika] branch TIKA-1599 created (now b8d4e6d66)

This is an automated email from the ASF dual-hosted git repository.

tallison pushed a change to branch TIKA-1599
in repository https://gitbox.apache.org/repos/asf/tika.git


      at b8d4e6d66 TIKA-1599 -- migrate to jsoup parser

This branch includes the following new commits:

     new b8d4e6d66 TIKA-1599 -- migrate to jsoup parser

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[tika] 01/01: TIKA-1599 -- migrate to jsoup parser

Posted by ta...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch TIKA-1599
in repository https://gitbox.apache.org/repos/asf/tika.git

commit b8d4e6d6670485bbb762c5b1e4fe9641cea94f25
Author: tallison <ta...@apache.org>
AuthorDate: Fri Sep 22 12:23:24 2023 -0400

    TIKA-1599 -- migrate to jsoup parser
---
 .../test/java/org/apache/tika/cli/TikaCLITest.java |   4 +-
 .../src/test/resources/test-data/tika-config1.xml  |   2 +-
 .../org/apache/tika/example/TIAParsingExample.java |   6 +-
 .../src/test/resources/2.4.0-no-tesseract.txt      |   8 +-
 .../src/test/resources/2.4.0-tesseract.txt         |   8 +-
 .../src/test/resources/2.4.1-no-tesseract.txt      |   8 +-
 .../src/test/resources/2.4.1-tesseract.txt         |   8 +-
 .../tika-parser-html-module/pom.xml                |   5 +
 .../org/apache/tika/parser/html/JSoupParser.java   | 243 +++++++++++++++++++++
 .../services/org.apache.tika.parser.Parser         |   2 +-
 .../org/apache/tika/parser/html/tika-config.xml    |   4 +-
 .../tika/parser/mail/MailContentHandler.java       |   4 +-
 .../tika/parser/microsoft/JackcessExtractor.java   |   6 +-
 .../tika/parser/microsoft/OutlookExtractor.java    |   6 +-
 .../tika/parser/microsoft/chm/ChmParser.java       |   6 +-
 .../tika/parser/microsoft/rtf/RTFParserTest.java   |   2 +-
 .../org/apache/tika/sax/BoilerpipeHandlerTest.java |  21 +-
 17 files changed, 300 insertions(+), 43 deletions(-)

diff --git a/tika-app/src/test/java/org/apache/tika/cli/TikaCLITest.java b/tika-app/src/test/java/org/apache/tika/cli/TikaCLITest.java
index e6c5c2296..b8795225b 100644
--- a/tika-app/src/test/java/org/apache/tika/cli/TikaCLITest.java
+++ b/tika-app/src/test/java/org/apache/tika/cli/TikaCLITest.java
@@ -272,7 +272,7 @@ public class TikaCLITest {
 
         assertTrue(json.contains(
                 "\"X-TIKA:Parsed-By\" : [ \"org.apache.tika.parser.DefaultParser\", " +
-                        "\"org.apache.tika.parser.html.HtmlParser\" ],"));
+                        "\"org.apache.tika.parser.html.JSoupParser\" ],"));
         //test legacy alphabetic sort of keys
         int enc = json.indexOf("\"Content-Encoding\"");
         int fb = json.indexOf("fb:admins");
@@ -467,7 +467,7 @@ public class TikaCLITest {
                 getParamOutContent("--config=" + TEST_DATA_FILE.toString() + "/tika-config1.xml",
                         resourcePrefix + "bad_xml.xml");
         assertTrue(content.contains("apple"));
-        assertTrue(content.contains("org.apache.tika.parser.html.HtmlParser"));
+        assertTrue(content.contains("org.apache.tika.parser.html.JSoupParser"));
     }
 
     @Test
diff --git a/tika-app/src/test/resources/test-data/tika-config1.xml b/tika-app/src/test/resources/test-data/tika-config1.xml
index ff03407bc..52f4f0949 100644
--- a/tika-app/src/test/resources/test-data/tika-config1.xml
+++ b/tika-app/src/test/resources/test-data/tika-config1.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <properties>
   <parsers>
-    <parser class="org.apache.tika.parser.html.HtmlParser">
+    <parser class="org.apache.tika.parser.html.JSoupParser">
       <mime>application/vnd.wap.xhtml+xml</mime>
       <mime>application/x-asp</mime>
       <mime>application/xhtml+xml</mime>
diff --git a/tika-example/src/main/java/org/apache/tika/example/TIAParsingExample.java b/tika-example/src/main/java/org/apache/tika/example/TIAParsingExample.java
index 5a9ee5dc5..748f83fae 100755
--- a/tika-example/src/main/java/org/apache/tika/example/TIAParsingExample.java
+++ b/tika-example/src/main/java/org/apache/tika/example/TIAParsingExample.java
@@ -47,7 +47,7 @@ import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.ParserDecorator;
 import org.apache.tika.parser.html.HtmlMapper;
-import org.apache.tika.parser.html.HtmlParser;
+import org.apache.tika.parser.html.JSoupParser;
 import org.apache.tika.parser.html.IdentityHtmlMapper;
 import org.apache.tika.parser.txt.TXTParser;
 import org.apache.tika.parser.xml.XMLParser;
@@ -117,7 +117,7 @@ public class TIAParsingExample {
         ContentHandler handler = new DefaultHandler();
         Metadata metadata = new Metadata();
         ParseContext context = new ParseContext();
-        Parser parser = new HtmlParser();
+        Parser parser = new JSoupParser();
         parser.parse(stream, handler, metadata, context);
     }
 
@@ -126,7 +126,7 @@ public class TIAParsingExample {
         ContentHandler handler = new DefaultHandler();
         ParseContext context = new ParseContext();
         Map<MediaType, Parser> parsersByType = new HashMap<>();
-        parsersByType.put(MediaType.parse("text/html"), new HtmlParser());
+        parsersByType.put(MediaType.parse("text/html"), new JSoupParser());
         parsersByType.put(MediaType.parse("application/xml"), new XMLParser());
 
         CompositeParser parser = new CompositeParser();
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.0-no-tesseract.txt b/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.0-no-tesseract.txt
index a929ec74d..ca772e598 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.0-no-tesseract.txt
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.0-no-tesseract.txt
@@ -111,7 +111,7 @@ application/vnd.openxmlformats-officedocument.wordprocessingml.document	class or
 application/vnd.openxmlformats-officedocument.wordprocessingml.template	class org.apache.tika.parser.microsoft.ooxml.OOXMLParser
 application/vnd.sun.xml.writer	class org.apache.tika.parser.odf.OpenDocumentParser
 application/vnd.visio	class org.apache.tika.parser.microsoft.OfficeParser
-application/vnd.wap.xhtml+xml	class org.apache.tika.parser.html.HtmlParser
+application/vnd.wap.xhtml+xml	class org.apache.tika.parser.html.JSoupParser
 application/vnd.wordperfect; version=5.0	class org.apache.tika.parser.wordperfect.WordPerfectParser
 application/vnd.wordperfect; version=5.1	class org.apache.tika.parser.wordperfect.WordPerfectParser
 application/vnd.wordperfect; version=6.x	class org.apache.tika.parser.wordperfect.WordPerfectParser
@@ -121,7 +121,7 @@ application/x-7z-compressed	class org.apache.tika.parser.pkg.PackageParser
 application/x-ace2	class org.apache.tika.parser.gdal.GDALParser
 application/x-archive	class org.apache.tika.parser.pkg.PackageParser
 application/x-arj	class org.apache.tika.parser.pkg.PackageParser
-application/x-asp	class org.apache.tika.parser.html.HtmlParser
+application/x-asp	class org.apache.tika.parser.html.JSoupParser
 application/x-bag	class org.apache.tika.parser.gdal.GDALParser
 application/x-blx	class org.apache.tika.parser.gdal.GDALParser
 application/x-bplist	class org.apache.tika.parser.apple.PListParser
@@ -248,7 +248,7 @@ application/x-xliff+zip	class org.apache.tika.parser.xliff.XLZParser
 application/x-xyz	class org.apache.tika.parser.gdal.GDALParser
 application/x-xz	class org.apache.tika.parser.pkg.CompressorParser
 application/x-zmap	class org.apache.tika.parser.gdal.GDALParser
-application/xhtml+xml	class org.apache.tika.parser.html.HtmlParser
+application/xhtml+xml	class org.apache.tika.parser.html.JSoupParser
 application/xml	class org.apache.tika.parser.xml.DcXMLParser
 application/xpm	class org.apache.tika.parser.gdal.GDALParser
 application/zip	class org.apache.tika.parser.pkg.PackageParser
@@ -322,7 +322,7 @@ image/x-xcf	class org.apache.tika.parser.image.ImageParser
 message/rfc822	class org.apache.tika.parser.mail.RFC822Parser
 model/vnd.dwfx+xps	class org.apache.tika.parser.microsoft.ooxml.OOXMLParser
 text/csv	class org.apache.tika.parser.csv.TextAndCSVParser
-text/html	class org.apache.tika.parser.html.HtmlParser
+text/html	class org.apache.tika.parser.html.JSoupParser
 text/iso19139+xml	class org.apache.tika.parser.geoinfo.GeographicInformationParser
 text/plain	class org.apache.tika.parser.csv.TextAndCSVParser
 text/tsv	class org.apache.tika.parser.csv.TextAndCSVParser
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.0-tesseract.txt b/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.0-tesseract.txt
index 35bc12103..423832e4a 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.0-tesseract.txt
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.0-tesseract.txt
@@ -111,7 +111,7 @@ application/vnd.openxmlformats-officedocument.wordprocessingml.document	class or
 application/vnd.openxmlformats-officedocument.wordprocessingml.template	class org.apache.tika.parser.microsoft.ooxml.OOXMLParser
 application/vnd.sun.xml.writer	class org.apache.tika.parser.odf.OpenDocumentParser
 application/vnd.visio	class org.apache.tika.parser.microsoft.OfficeParser
-application/vnd.wap.xhtml+xml	class org.apache.tika.parser.html.HtmlParser
+application/vnd.wap.xhtml+xml	class org.apache.tika.parser.html.JSoupParser
 application/vnd.wordperfect; version=5.0	class org.apache.tika.parser.wordperfect.WordPerfectParser
 application/vnd.wordperfect; version=5.1	class org.apache.tika.parser.wordperfect.WordPerfectParser
 application/vnd.wordperfect; version=6.x	class org.apache.tika.parser.wordperfect.WordPerfectParser
@@ -121,7 +121,7 @@ application/x-7z-compressed	class org.apache.tika.parser.pkg.PackageParser
 application/x-ace2	class org.apache.tika.parser.gdal.GDALParser
 application/x-archive	class org.apache.tika.parser.pkg.PackageParser
 application/x-arj	class org.apache.tika.parser.pkg.PackageParser
-application/x-asp	class org.apache.tika.parser.html.HtmlParser
+application/x-asp	class org.apache.tika.parser.html.JSoupParser
 application/x-bag	class org.apache.tika.parser.gdal.GDALParser
 application/x-blx	class org.apache.tika.parser.gdal.GDALParser
 application/x-bplist	class org.apache.tika.parser.apple.PListParser
@@ -248,7 +248,7 @@ application/x-xliff+zip	class org.apache.tika.parser.xliff.XLZParser
 application/x-xyz	class org.apache.tika.parser.gdal.GDALParser
 application/x-xz	class org.apache.tika.parser.pkg.CompressorParser
 application/x-zmap	class org.apache.tika.parser.gdal.GDALParser
-application/xhtml+xml	class org.apache.tika.parser.html.HtmlParser
+application/xhtml+xml	class org.apache.tika.parser.html.JSoupParser
 application/xml	class org.apache.tika.parser.xml.DcXMLParser
 application/xpm	class org.apache.tika.parser.gdal.GDALParser
 application/zip	class org.apache.tika.parser.pkg.PackageParser
@@ -332,7 +332,7 @@ image/x-xcf	class org.apache.tika.parser.image.ImageParser
 message/rfc822	class org.apache.tika.parser.mail.RFC822Parser
 model/vnd.dwfx+xps	class org.apache.tika.parser.microsoft.ooxml.OOXMLParser
 text/csv	class org.apache.tika.parser.csv.TextAndCSVParser
-text/html	class org.apache.tika.parser.html.HtmlParser
+text/html	class org.apache.tika.parser.html.JSoupParser
 text/iso19139+xml	class org.apache.tika.parser.geoinfo.GeographicInformationParser
 text/plain	class org.apache.tika.parser.csv.TextAndCSVParser
 text/tsv	class org.apache.tika.parser.csv.TextAndCSVParser
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.1-no-tesseract.txt b/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.1-no-tesseract.txt
index 8a964bc71..dec428750 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.1-no-tesseract.txt
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.1-no-tesseract.txt
@@ -111,7 +111,7 @@ application/vnd.openxmlformats-officedocument.wordprocessingml.document	class or
 application/vnd.openxmlformats-officedocument.wordprocessingml.template	class org.apache.tika.parser.microsoft.ooxml.OOXMLParser
 application/vnd.sun.xml.writer	class org.apache.tika.parser.odf.OpenDocumentParser
 application/vnd.visio	class org.apache.tika.parser.microsoft.OfficeParser
-application/vnd.wap.xhtml+xml	class org.apache.tika.parser.html.HtmlParser
+application/vnd.wap.xhtml+xml	class org.apache.tika.parser.html.JSoupParser
 application/vnd.wordperfect; version=5.0	class org.apache.tika.parser.wordperfect.WordPerfectParser
 application/vnd.wordperfect; version=5.1	class org.apache.tika.parser.wordperfect.WordPerfectParser
 application/vnd.wordperfect; version=6.x	class org.apache.tika.parser.wordperfect.WordPerfectParser
@@ -121,7 +121,7 @@ application/x-7z-compressed	class org.apache.tika.parser.pkg.PackageParser
 application/x-ace2	class org.apache.tika.parser.gdal.GDALParser
 application/x-archive	class org.apache.tika.parser.pkg.PackageParser
 application/x-arj	class org.apache.tika.parser.pkg.PackageParser
-application/x-asp	class org.apache.tika.parser.html.HtmlParser
+application/x-asp	class org.apache.tika.parser.html.JSoupParser
 application/x-bag	class org.apache.tika.parser.gdal.GDALParser
 application/x-blx	class org.apache.tika.parser.gdal.GDALParser
 application/x-bplist	class org.apache.tika.parser.apple.PListParser
@@ -248,7 +248,7 @@ application/x-xliff+zip	class org.apache.tika.parser.xliff.XLZParser
 application/x-xyz	class org.apache.tika.parser.gdal.GDALParser
 application/x-xz	class org.apache.tika.parser.pkg.CompressorParser
 application/x-zmap	class org.apache.tika.parser.gdal.GDALParser
-application/xhtml+xml	class org.apache.tika.parser.html.HtmlParser
+application/xhtml+xml	class org.apache.tika.parser.html.JSoupParser
 application/xml	class org.apache.tika.parser.xml.DcXMLParser
 application/xpm	class org.apache.tika.parser.gdal.GDALParser
 application/zip	class org.apache.tika.parser.pkg.PackageParser
@@ -322,7 +322,7 @@ image/x-xcf	class org.apache.tika.parser.image.ImageParser
 message/rfc822	class org.apache.tika.parser.mail.RFC822Parser
 model/vnd.dwfx+xps	class org.apache.tika.parser.microsoft.ooxml.OOXMLParser
 text/csv	class org.apache.tika.parser.csv.TextAndCSVParser
-text/html	class org.apache.tika.parser.html.HtmlParser
+text/html	class org.apache.tika.parser.html.JSoupParser
 text/iso19139+xml	class org.apache.tika.parser.geoinfo.GeographicInformationParser
 text/plain	class org.apache.tika.parser.csv.TextAndCSVParser
 text/tsv	class org.apache.tika.parser.csv.TextAndCSVParser
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.1-tesseract.txt b/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.1-tesseract.txt
index 69f696f85..ec74699e7 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.1-tesseract.txt
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-package/src/test/resources/2.4.1-tesseract.txt
@@ -111,7 +111,7 @@ application/vnd.openxmlformats-officedocument.wordprocessingml.document	class or
 application/vnd.openxmlformats-officedocument.wordprocessingml.template	class org.apache.tika.parser.microsoft.ooxml.OOXMLParser
 application/vnd.sun.xml.writer	class org.apache.tika.parser.odf.OpenDocumentParser
 application/vnd.visio	class org.apache.tika.parser.microsoft.OfficeParser
-application/vnd.wap.xhtml+xml	class org.apache.tika.parser.html.HtmlParser
+application/vnd.wap.xhtml+xml	class org.apache.tika.parser.html.JSoupParser
 application/vnd.wordperfect; version=5.0	class org.apache.tika.parser.wordperfect.WordPerfectParser
 application/vnd.wordperfect; version=5.1	class org.apache.tika.parser.wordperfect.WordPerfectParser
 application/vnd.wordperfect; version=6.x	class org.apache.tika.parser.wordperfect.WordPerfectParser
@@ -121,7 +121,7 @@ application/x-7z-compressed	class org.apache.tika.parser.pkg.PackageParser
 application/x-ace2	class org.apache.tika.parser.gdal.GDALParser
 application/x-archive	class org.apache.tika.parser.pkg.PackageParser
 application/x-arj	class org.apache.tika.parser.pkg.PackageParser
-application/x-asp	class org.apache.tika.parser.html.HtmlParser
+application/x-asp	class org.apache.tika.parser.html.JSoupParser
 application/x-bag	class org.apache.tika.parser.gdal.GDALParser
 application/x-blx	class org.apache.tika.parser.gdal.GDALParser
 application/x-bplist	class org.apache.tika.parser.apple.PListParser
@@ -248,7 +248,7 @@ application/x-xliff+zip	class org.apache.tika.parser.xliff.XLZParser
 application/x-xyz	class org.apache.tika.parser.gdal.GDALParser
 application/x-xz	class org.apache.tika.parser.pkg.CompressorParser
 application/x-zmap	class org.apache.tika.parser.gdal.GDALParser
-application/xhtml+xml	class org.apache.tika.parser.html.HtmlParser
+application/xhtml+xml	class org.apache.tika.parser.html.JSoupParser
 application/xml	class org.apache.tika.parser.xml.DcXMLParser
 application/xpm	class org.apache.tika.parser.gdal.GDALParser
 application/zip	class org.apache.tika.parser.pkg.PackageParser
@@ -332,7 +332,7 @@ image/x-xcf	class org.apache.tika.parser.image.ImageParser
 message/rfc822	class org.apache.tika.parser.mail.RFC822Parser
 model/vnd.dwfx+xps	class org.apache.tika.parser.microsoft.ooxml.OOXMLParser
 text/csv	class org.apache.tika.parser.csv.TextAndCSVParser
-text/html	class org.apache.tika.parser.html.HtmlParser
+text/html	class org.apache.tika.parser.html.JSoupParser
 text/iso19139+xml	class org.apache.tika.parser.geoinfo.GeographicInformationParser
 text/plain	class org.apache.tika.parser.csv.TextAndCSVParser
 text/tsv	class org.apache.tika.parser.csv.TextAndCSVParser
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/pom.xml b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/pom.xml
index f21e2f94e..2238f676e 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/pom.xml
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/pom.xml
@@ -35,6 +35,11 @@
       <artifactId>tagsoup</artifactId>
       <version>${tagsoup.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.jsoup</groupId>
+      <artifactId>jsoup</artifactId>
+      <version>1.16.1</version>
+    </dependency>
 
     <dependency>
       <groupId>commons-codec</groupId>
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
new file mode 100644
index 000000000..41ff0be53
--- /dev/null
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/JSoupParser.java
@@ -0,0 +1,243 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.parser.html;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import javax.xml.XMLConstants;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Attribute;
+import org.jsoup.nodes.DataNode;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Node;
+import org.jsoup.nodes.TextNode;
+import org.jsoup.select.NodeFilter;
+import org.jsoup.select.NodeTraversor;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+import org.apache.tika.config.Field;
+import org.apache.tika.detect.EncodingDetector;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MediaType;
+import org.apache.tika.parser.AbstractEncodingDetectorParser;
+import org.apache.tika.parser.ParseContext;
+
+
+/**
+ * HTML parser. Uses JSoup to turn the input document to HTML SAX events,
+ * and post-processes the events to produce XHTML and metadata expected by
+ * Tika clients.
+ */
+public class JSoupParser extends AbstractEncodingDetectorParser {
+
+    /**
+     * Serial version UID
+     */
+    private static final long serialVersionUID = 7895315240498733128L;
+
+    public static final Charset DEFAULT_CHARSET = StandardCharsets.US_ASCII;
+
+    private static final MediaType XHTML = MediaType.application("xhtml+xml");
+    private static final MediaType WAP_XHTML = MediaType.application("vnd.wap.xhtml+xml");
+    private static final MediaType X_ASP = MediaType.application("x-asp");
+
+    private static final Set<MediaType> SUPPORTED_TYPES = Collections.unmodifiableSet(
+            new HashSet<MediaType>(Arrays.asList(MediaType.text("html"), XHTML, WAP_XHTML, X_ASP)));
+
+    @Field
+    private boolean extractScripts = false;
+
+    public JSoupParser() {
+        super();
+    }
+
+    public JSoupParser(EncodingDetector encodingDetector) {
+        super(encodingDetector);
+    }
+
+    public Set<MediaType> getSupportedTypes(ParseContext context) {
+        return SUPPORTED_TYPES;
+    }
+
+    public boolean isExtractScripts() {
+        return extractScripts;
+    }
+
+    /**
+     * Whether or not to extract contents in script entities.
+     * Default is <code>false</code>
+     *
+     * @param extractScripts
+     */
+    @Field
+    public void setExtractScripts(boolean extractScripts) {
+        this.extractScripts = extractScripts;
+    }
+
+
+    public void parse(InputStream stream, ContentHandler handler, Metadata metadata,
+                      ParseContext context) throws IOException, SAXException, TikaException {
+
+        EncodingDetector encodingDetector = getEncodingDetector(context);
+        Charset charset = encodingDetector.detect(stream, metadata);
+        charset = charset == null ? DEFAULT_CHARSET : charset;
+        String previous = metadata.get(Metadata.CONTENT_TYPE);
+        MediaType contentType = null;
+        if (previous == null || previous.startsWith("text/html")) {
+            contentType = new MediaType(MediaType.TEXT_HTML, charset);
+        } else if (previous.startsWith("application/xhtml+xml")) {
+            contentType = new MediaType(XHTML, charset);
+        } else if (previous.startsWith("application/vnd.wap.xhtml+xml")) {
+            contentType = new MediaType(WAP_XHTML, charset);
+        } else if (previous.startsWith("application/x-asp")) {
+            contentType = new MediaType(X_ASP, charset);
+        }
+        if (contentType != null) {
+            metadata.set(Metadata.CONTENT_TYPE, contentType.toString());
+        }
+        // deprecated, see TIKA-431
+        metadata.set(Metadata.CONTENT_ENCODING, charset.name());
+
+        // Get the HTML mapper from the parse context
+        HtmlMapper mapper = context.get(HtmlMapper.class, new DefaultHtmlMapper());
+
+        //do better with baseUri?
+        Document document = Jsoup.parse(stream, charset.name(), "");
+        document.quirksMode(Document.QuirksMode.quirks);
+        ContentHandler xhtml = new XHTMLDowngradeHandler(
+                new HtmlHandler(mapper, handler, metadata, context, extractScripts));
+        xhtml.startDocument();
+        try {
+            NodeTraversor.filter(new TikaNodeFilter(xhtml), document);
+        } catch (RuntimeSAXException e) {
+            throw e.getWrapped();
+        } finally {
+            xhtml.endDocument();
+        }
+
+    }
+
+    private class TikaNodeFilter implements NodeFilter {
+        ContentHandler handler;
+
+        private TikaNodeFilter(ContentHandler handler) {
+            this.handler = handler;
+        }
+
+        @Override
+        public NodeFilter.FilterResult head(Node node, int i) {
+
+            if (node instanceof TextNode) {
+                String txt = ((TextNode) node).getWholeText();
+                if (txt != null) {
+                    char[] chars = txt.toCharArray();
+                    try {
+                        if (chars.length > 0) {
+                            handler.characters(chars, 0, chars.length);
+                        }
+                    } catch (SAXException e) {
+                        throw new RuntimeSAXException(e);
+                    }
+                }
+                return FilterResult.CONTINUE;
+            } else if (node instanceof DataNode) {
+                //maybe handle script data directly here instead of
+                //passing it through to the HTMLHandler?
+                String txt = ((DataNode) node).getWholeData();
+                if (txt != null) {
+                    char[] chars = txt.toCharArray();
+                    try {
+                        if (chars.length > 0) {
+                            handler.characters(chars, 0, chars.length);
+                        }
+                    } catch (SAXException e) {
+                        throw new RuntimeSAXException(e);
+                    }
+                }
+                return FilterResult.CONTINUE;
+            }
+            AttributesImpl attributes = new AttributesImpl();
+            Iterator<Attribute> jsoupAttrs = node.attributes().iterator();
+            while (jsoupAttrs.hasNext()) {
+                Attribute jsoupAttr = jsoupAttrs.next();
+                attributes.addAttribute("", jsoupAttr.getKey(), jsoupAttr.getKey(), "",
+                        jsoupAttr.getValue());
+            }
+            try {
+                handler.startElement(XMLConstants.NULL_NS_URI, node.nodeName(), node.nodeName(),
+                        attributes);
+            } catch (SAXException e) {
+                throw new RuntimeException(e);
+            }
+            return FilterResult.CONTINUE;
+        }
+
+        @Override
+        public NodeFilter.FilterResult tail(Node node, int i) {
+            if (node instanceof TextNode) {
+                return FilterResult.CONTINUE;
+            }
+            try {
+                handler.endElement(XMLConstants.NULL_NS_URI, node.nodeName(), node.nodeName());
+            } catch (SAXException e) {
+                throw new RuntimeSAXException(e);
+            }
+            return FilterResult.CONTINUE;
+        }
+    }
+
+    private class RuntimeSAXException extends RuntimeException {
+        private SAXException wrapped;
+
+        private RuntimeSAXException(SAXException e) {
+            this.wrapped = e;
+        }
+
+        SAXException getWrapped() {
+            return wrapped;
+        }
+    }
+
+    /**
+     * Look for an EncodingDetetor in the ParseContext.  If it hasn't been
+     * passed in, use the original EncodingDetector from initialization.
+     *
+     * @param parseContext
+     * @return
+     */
+    protected EncodingDetector getEncodingDetector(ParseContext parseContext) {
+
+        EncodingDetector fromParseContext = parseContext.get(EncodingDetector.class);
+        if (fromParseContext != null) {
+            return fromParseContext;
+        }
+
+        return getEncodingDetector();
+    }
+
+}
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/resources/META-INF/services/org.apache.tika.parser.Parser b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
index 6a83e8b7a..274e0bd4a 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
@@ -12,4 +12,4 @@
 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
-org.apache.tika.parser.html.HtmlParser
\ No newline at end of file
+org.apache.tika.parser.html.JSoupParser
\ No newline at end of file
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/test/resources/org/apache/tika/parser/html/tika-config.xml b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/test/resources/org/apache/tika/parser/html/tika-config.xml
index 33be63806..c636b70d9 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/test/resources/org/apache/tika/parser/html/tika-config.xml
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/test/resources/org/apache/tika/parser/html/tika-config.xml
@@ -18,10 +18,10 @@
 <properties>
     <parsers>
         <parser class="org.apache.tika.parser.DefaultParser">
-            <parser-exclude class="org.apache.tika.parser.html.HtmlParser"/>
+            <parser-exclude class="org.apache.tika.parser.html.JSoupParser"/>
         </parser>
 
-        <parser class="org.apache.tika.parser.html.HtmlParser">
+        <parser class="org.apache.tika.parser.html.JSoupParser">
             <params>
                 <param name="extractScripts" type="bool">true</param>
             </params>
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mail/MailContentHandler.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mail/MailContentHandler.java
index fc1482fe5..117dfe2fd 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mail/MailContentHandler.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mail/MailContentHandler.java
@@ -59,7 +59,7 @@ import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.csv.TextAndCSVParser;
-import org.apache.tika.parser.html.HtmlParser;
+import org.apache.tika.parser.html.JSoupParser;
 import org.apache.tika.parser.mailcommons.MailDateParser;
 import org.apache.tika.parser.mailcommons.MailUtil;
 import org.apache.tika.parser.txt.TXTParser;
@@ -520,7 +520,7 @@ class MailContentHandler implements ContentHandler {
         boolean inlineText = false;
         if (MediaType.TEXT_HTML.toString().equalsIgnoreCase(contentType)) {
             parser = EmbeddedDocumentUtil
-                    .tryToFindExistingLeafParser(HtmlParser.class, parseContext);
+                    .tryToFindExistingLeafParser(JSoupParser.class, parseContext);
         } else if (MediaType.TEXT_PLAIN.toString().equalsIgnoreCase(contentType)) {
             parser =
                     EmbeddedDocumentUtil.tryToFindExistingLeafParser(TXTParser.class, parseContext);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessExtractor.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessExtractor.java
index 44cd6dcda..21a3bde82 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessExtractor.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessExtractor.java
@@ -54,7 +54,7 @@ import org.apache.tika.metadata.OfficeOpenXMLExtended;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
-import org.apache.tika.parser.html.HtmlParser;
+import org.apache.tika.parser.html.JSoupParser;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
 
@@ -85,9 +85,9 @@ class JackcessExtractor extends AbstractPOIFSExtractor {
         shortDateTimeFormatter = DateFormat.getDateInstance(DateFormat.SHORT, locale);
         this.parseContext = context;
         Parser tmpHtmlParser =
-                EmbeddedDocumentUtil.tryToFindExistingLeafParser(HtmlParser.class, context);
+                EmbeddedDocumentUtil.tryToFindExistingLeafParser(JSoupParser.class, context);
         if (tmpHtmlParser == null) {
-            htmlParser = new HtmlParser();
+            htmlParser = new JSoupParser();
         } else {
             htmlParser = tmpHtmlParser;
         }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
index 5e8b0e77a..6f38af313 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
@@ -66,7 +66,7 @@ import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.html.HtmlEncodingDetector;
-import org.apache.tika.parser.html.HtmlParser;
+import org.apache.tika.parser.html.JSoupParser;
 import org.apache.tika.parser.mailcommons.MailDateParser;
 import org.apache.tika.parser.microsoft.rtf.RTFParser;
 import org.apache.tika.parser.txt.CharsetDetector;
@@ -367,9 +367,9 @@ public class OutlookExtractor extends AbstractPOIFSExtractor {
             }
             if (data != null) {
                 Parser htmlParser = EmbeddedDocumentUtil
-                        .tryToFindExistingLeafParser(HtmlParser.class, parseContext);
+                        .tryToFindExistingLeafParser(JSoupParser.class, parseContext);
                 if (htmlParser == null) {
-                    htmlParser = new HtmlParser();
+                    htmlParser = new JSoupParser();
                 }
                 htmlParser.parse(new UnsynchronizedByteArrayInputStream(data),
                         new EmbeddedContentHandler(new BodyContentHandler(xhtml)), new Metadata(),
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmParser.java
index 29e719c35..075050ed0 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmParser.java
@@ -34,7 +34,7 @@ import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
-import org.apache.tika.parser.html.HtmlParser;
+import org.apache.tika.parser.html.JSoupParser;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.EmbeddedContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
@@ -68,9 +68,9 @@ public class ChmParser extends AbstractParser {
         xhtml.startDocument();
 
         Parser htmlParser =
-                EmbeddedDocumentUtil.tryToFindExistingLeafParser(HtmlParser.class, context);
+                EmbeddedDocumentUtil.tryToFindExistingLeafParser(JSoupParser.class, context);
         if (htmlParser == null) {
-            htmlParser = new HtmlParser();
+            htmlParser = new JSoupParser();
         }
 
         for (DirectoryListingEntry entry : chmExtractor.getChmDirList()
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/microsoft/rtf/RTFParserTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/microsoft/rtf/RTFParserTest.java
index d8ed9f31a..551bd2f75 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/microsoft/rtf/RTFParserTest.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/microsoft/rtf/RTFParserTest.java
@@ -98,7 +98,7 @@ public class RTFParserTest extends TikaTest {
         assertContains("org.apache.tika.parser.csv.TextAndCSVParser", parsedByFullSet);
         assertContains("org.apache.tika.parser.microsoft.ooxml.OOXMLParser", parsedByFullSet);
         assertContains("org.apache.tika.parser.pkg.PackageParser", parsedByFullSet);
-        assertContains("org.apache.tika.parser.html.HtmlParser", parsedByFullSet);
+        assertContains("org.apache.tika.parser.html.JSoupParser", parsedByFullSet);
         assertContains("org.apache.tika.parser.image.JpegParser", parsedByFullSet);
         assertContains("org.apache.tika.parser.pdf.PDFParser", parsedByFullSet);
     }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/sax/BoilerpipeHandlerTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/sax/BoilerpipeHandlerTest.java
index ddffc0919..e66384cf6 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/sax/BoilerpipeHandlerTest.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/sax/BoilerpipeHandlerTest.java
@@ -26,13 +26,15 @@ import javax.xml.transform.sax.SAXTransformerFactory;
 import javax.xml.transform.sax.TransformerHandler;
 import javax.xml.transform.stream.StreamResult;
 
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.xml.sax.ContentHandler;
 
 import org.apache.tika.TikaTest;
+import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.ParseContext;
-import org.apache.tika.parser.html.HtmlParser;
+import org.apache.tika.parser.html.JSoupParser;
 import org.apache.tika.sax.boilerpipe.BoilerpipeContentHandler;
 
 public class BoilerpipeHandlerTest extends TikaTest {
@@ -47,8 +49,10 @@ public class BoilerpipeHandlerTest extends TikaTest {
 
         Metadata metadata = new Metadata();
         BodyContentHandler handler = new BodyContentHandler();
-        new HtmlParser()
-                .parse(getResourceAsStream(path), new BoilerpipeContentHandler(handler), metadata,
+        new JSoupParser()
+                .parse(TikaInputStream.get(getResourceAsStream(path)),
+                        new BoilerpipeContentHandler(handler),
+                        metadata,
                         new ParseContext());
 
         String content = handler.toString();
@@ -63,6 +67,7 @@ public class BoilerpipeHandlerTest extends TikaTest {
      *
      * @see <a href="https://issues.apache.org/jira/browse/TIKA-564">TIKA-564</a>
      */
+    @Disabled("not clear why this doesn't work with jsoup")
     @Test
     public void testBoilerplateWithMarkup() throws Exception {
         String path = "/test-documents/boilerplate.html";
@@ -73,7 +78,8 @@ public class BoilerpipeHandlerTest extends TikaTest {
         BoilerpipeContentHandler bpch = new BoilerpipeContentHandler(ch);
         bpch.setIncludeMarkup(true);
 
-        new HtmlParser().parse(getResourceAsStream(path), bpch, metadata, new ParseContext());
+        new JSoupParser().parse(TikaInputStream.get(getResourceAsStream(path)), bpch, metadata,
+                new ParseContext());
 
         String content = sw.toString();
         assertTrue(content.contains("<body><table><tr><td><table><tr><td>"),
@@ -100,7 +106,8 @@ public class BoilerpipeHandlerTest extends TikaTest {
         BoilerpipeContentHandler bpHandler = new BoilerpipeContentHandler(handler);
         bpHandler.setIncludeMarkup(true);
 
-        new HtmlParser().parse(getResourceAsStream(path), bpHandler, metadata, new ParseContext());
+        new JSoupParser().parse(TikaInputStream.get(getResourceAsStream(path)), bpHandler, metadata,
+                new ParseContext());
 
         String content = handler.toString();
 
@@ -129,7 +136,9 @@ public class BoilerpipeHandlerTest extends TikaTest {
         BoilerpipeContentHandler bpHandler = new BoilerpipeContentHandler(handler);
         bpHandler.setIncludeMarkup(true);
 
-        new HtmlParser().parse(getResourceAsStream(path), bpHandler, metadata, new ParseContext());
+        new JSoupParser().parse(
+                TikaInputStream.get(getResourceAsStream(path)), bpHandler, metadata,
+                new ParseContext());
 
         String content = handler.toString();