[英]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使用下面的 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來進行自定義處理並從文件中准確獲取您想要的內容。
在某些情況下,這可能是寫出特定內容,例如在下面的示例中,或者在其他情況下,它可能是處理,例如收集和提供可用鏈接,如在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.