簡體   English   中英

java tika 如何將 html 轉換為純文本保留特定元素

[英]java tika how to convert html to plain text retaining specific element

下面的代碼可以完美地將 html 轉換為純文本......

Url url = new URL(your_url);
InputStream is = url.openStream(); 
ContentHandler textHandler = new BodyContentHandler();
Metadata metadata = new Metadata();
AutoDetectParser parser = new AutoDetectParser();
ParseContext context = new ParseContext();
parser.parse(is, textHandler, metadata, context);
System.out.println("Body: " + textHandler.toString());

我的問題是:如何保留/保留特定元素,如鏈接,等...或如何防止特定元素如鏈接,在 html 到純文本轉換中被刪除?

謝謝和最好的問候...

您可以通過多種方式將 Apache Tika 用於此類工作。

正如 Gagravarr 所說,您使用的 ContentHandler 是這里的關鍵。 有許多有用的方法可以在這里提供幫助,或者您可以構建自己的自定義方法。

由於我不確定您要做什么,因此我嘗試分享一些常用方法的示例,特別是對於 HTML 內容。

匹配內容處理程序

一種常見的方法是使用MatchingContentHandler過濾您感興趣的內容:

URL url = new URL("http://tika.apache.org");
InputStream is = url.openStream();

// Only select <a> tags to be output
XPathParser xhtmlParser = new XPathParser("xhtml", XHTMLContentHandler.XHTML);
Matcher divContentMatcher = xhtmlParser.parse("//xhtml:a/descendant::node()");
MatchingContentHandler handler = new MatchingContentHandler(new ToHTMLContentHandler(), divContentMatcher);

// Parse based on original question
HtmlParser parser = new HtmlParser()
Metadata metadata = new Metadata();
parser.parse(is, handler, metadata, new ParseContext());
System.out.println("Links: " + handler.toString());

值得注意的是,這僅用於包含並且僅支持 XPath 的一個子集。 有關詳細信息,請參閱XPathParser

鏈接內容處理程序

如果您只想提取鏈接, LinkContentHandler是一個不錯的選擇:

URL url = new URL("http://tika.apache.org");
InputStream is = url.openStream();
LinkContentHandler linkHandler = new LinkContentHandler();
Metadata metadata = new Metadata();
HtmlParser parser = new HtmlParser();
parser.parse(is, linkHandler, metadata, new ParseContext());
System.out.println("Links: " + linkHandler.getLinks());

它的代碼也是如何構建自定義處理程序的一個很好的例子。

BoilerpipeContentHandler

BoilerpipeContentHandler使用下面的 Boilerpipe 庫,允許您使用它定義的提取器之一來處理內容。

URL url = new URL("http://tika.apache.org");
InputStream is = url.openStream();

ExtractorBase extractor = ArticleSentencesExtractor.getInstance();
BoilerpipeContentHandler textHandler = new BoilerpipeContentHandler(new BodyContentHandler(), extractor);

Metadata metadata = new Metadata();
HtmlParser parser = new HtmlParser();
parser.parse(is, textHandler, metadata, new ParseContext());

System.out.println(textHandler.getTextDocument().getTextBlocks());

如果您真的對里面的內容感興趣,這些會非常有用,因為提取器可以幫助您專注於內容。

自定義 ContentHandler 或 ContentHandlerDecorator

您可以構建自己的ContentHandler來進行自定義處理並從文件中准確獲取您想要的內容。

在某些情況下,這可能是寫出特定內容,例如在下面的示例中,或者在其他情況下,它可能是處理,例如收集和提供可用鏈接,如在LinkHandler 中

使用自定義ContentHandler實例非常強大,Apache Tika 代碼庫以及其他開源項目中提供了大量示例。

下面是一個人為的例子,只是試圖發出部分 HTML:

URL url = new URL("http://tika.apache.org");
InputStream is = url.openStream();

StringWriter sw = new StringWriter();
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
TransformerHandler handler = factory.newTransformerHandler();
handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "html");
handler.setResult(new StreamResult(sw));

ContentHandlerDecorator h2Handler = new ContentHandlerDecorator(handler) {
    private final List<String> elementsToInclude = List.of("h2");
    private boolean processElement = false;

    @Override
    public void startElement(String uri, String local, String name, Attributes atts)
            throws SAXException {
        if (elementsToInclude.contains(name)) {
            processElement = true;
            super.startElement(uri, local, name, atts);
        }
    }

    @Override
    public void ignorableWhitespace(char[] ch, int start, int length) {
        // Skip whitespace
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (!processElement) {
            return;
        }
        super.characters(ch, start, length);
    }

    @Override
    public void endElement(
            String uri, String local, String name) throws SAXException {
        if (elementsToInclude.contains(name)) {
            processElement = false;
            super.endElement(uri, local, name);
        }
      }
};

HtmlParser parser = new HtmlParser();
parser.parse(is, h2Handler, new Metadata(), new ParseContext());
System.out.println("Heading Level 2s: " + sw.toString());

正如您在其中一些示例中所看到的,一個或多個ContentHandler實例可以鏈接在一起,但值得注意的是,有些人希望輸出格式正確,因此請查看 Javadocs。 如果您想將不同的文件映射到您自己的通用格式, XHTMLContentHandler也很有用。

湯:)

另一條路線是JSoup ,如果您要直接處理 HTML,則直接(跳過 Tika 部分並使用Jsoup.connect() ),或者與 Apache Tika 鏈接,如果您想從不同文件類型生成的 HTML 中讀取。

URL url = new URL("http://tika.apache.org");
InputStream is = url.openStream();
ToHTMLContentHandler html = new ToHTMLContentHandler();
HtmlParser parser = new HtmlParser();
parser.parse(is, html, new Metadata(), new ParseContext());
Document doc = Jsoup.parse(html.toString());
Elements h2List = doc.select("h2");
for (Element headline : h2List) {
    System.out.println(headline.text());
}   

解析后,您可以使用 Jsoup 查詢文檔。 與為工作構建的 ContentHandler 相比,不是最有效的,但對於凌亂的內容集很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM