Java實(shí)現(xiàn)提取HTML文件中的文本內(nèi)容
從 HTML 文件中提取文本內(nèi)容是數(shù)據(jù)抓取中的一個(gè)常見任務(wù),你可以將提取的文本信息用于編制報(bào)告、進(jìn)行數(shù)據(jù)分析或其他處理。本文分享如何使用免費(fèi) Java API 從HTML 文件中提取文本內(nèi)容。
安裝免費(fèi)Java庫(kù)
要通過Java提取HTML文本,需要用到Free Spire.Doc for Java免費(fèi)庫(kù)。以下提供兩種安裝方式:
1. 通過Maven倉(cāng)庫(kù)安裝:
<repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>https://repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.doc.free</artifactId> <version>5.2.0</version> </dependency>
2. 下載Free Spire.Doc for Java庫(kù),解壓后手動(dòng)將Spire.Doc.jar添加到程序中。
使用Java從HTML文件中提取文本內(nèi)容
基本步驟:
- 導(dǎo)入需要的類庫(kù);
- 通過 loadFromFile() 方法加載HTML文件;
- 通過 getText() 方法獲取HTML文件中的文本內(nèi)容。
- 創(chuàng)建一個(gè) FileWriter 對(duì)象,將提取的文本內(nèi)容寫入一個(gè)txt文件中
示例代碼:
import com.spire.doc.Document; import com.spire.doc.FileFormat; import java.io.FileWriter; import java.io.IOException; public class ExtractTextFromHTML { public static void main(String[] args) throws IOException { //創(chuàng)建Document對(duì)象 Document doc = new Document(); //加載一個(gè)HTML文件 doc.loadFromFile("input.html", FileFormat.Html); //獲取HTML文件中的文本 String text = doc.getText(); //將文本寫入TXT文件 FileWriter fileWriter = new FileWriter("提取HTML文本.txt"); fileWriter.write(text); fileWriter.close(); } }
運(yùn)行結(jié)果 :
方法補(bǔ)充
除了上文的方法,小編還為大家整理了一個(gè)使用Java提取html文件中的文本內(nèi)容的工具類,需要的可以了解下
核心代碼
//核心代碼 String unescapeString = StringEscapeUtils.unescapeHtml4(inputString); String text = HTML2Text.convert(unescapeString); import javax.swing.text.MutableAttributeSet; import javax.swing.text.html.HTML; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.parser.ParserDelegator; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.Stack; import java.util.logging.Logger; public class HTML2Text extends HTMLEditorKit.ParserCallback { private static final Logger log = Logger .getLogger(Logger.GLOBAL_LOGGER_NAME); private StringBuffer stringBuffer; private Stack<IndexType> indentStack; public static class IndexType { public String type; public int counter; // used for ordered lists public IndexType(String type) { this.type = type; counter = 0; } } public HTML2Text() { stringBuffer = new StringBuffer(); indentStack = new Stack<>(); } public static String convert(String html) { HTML2Text parser = new HTML2Text(); Reader in = new StringReader(html); try { // the HTML to convert parser.parse(in); } catch (Exception e) { log.severe(e.getMessage()); } finally { try { in.close(); } catch (IOException ioe) { // this should never happen } } return parser.getText(); } public void parse(Reader in) throws IOException { ParserDelegator delegator = new ParserDelegator(); // the third parameter is TRUE to ignore charset directive delegator.parse(in, this, Boolean.TRUE); } @Override public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) { log.info("StartTag:" + t.toString()); if (t.toString().equals("p")) { if (stringBuffer.length() > 0 && !stringBuffer.substring(stringBuffer.length() - 1) .equals("\n")) { newLine(); } newLine(); } else if (t.toString().equals("ol")) { indentStack.push(new IndexType("ol")); newLine(); } else if (t.toString().equals("ul")) { indentStack.push(new IndexType("ul")); newLine(); } else if (t.toString().equals("li")) { IndexType parent = indentStack.peek(); if (parent.type.equals("ol")) { String numberString = "" + (++parent.counter) + "."; stringBuffer.append(numberString); for (int i = 0; i < (4 - numberString.length()); i++) { stringBuffer.append(" "); } } else { stringBuffer.append("* "); } indentStack.push(new IndexType("li")); } else if (t.toString().equals("dl")) { newLine(); } else if (t.toString().equals("dt")) { newLine(); } else if (t.toString().equals("dd")) { indentStack.push(new IndexType("dd")); newLine(); } } private void newLine() { stringBuffer.append("\n"); for (int i = 0; i < indentStack.size(); i++) { stringBuffer.append(" "); } } @Override public void handleEndTag(HTML.Tag t, int pos) { log.info("EndTag:" + t.toString()); if (t.toString().equals("p")) { newLine(); } else if (t.toString().equals("ol")) { indentStack.pop(); newLine(); } else if (t.toString().equals("ul")) { indentStack.pop(); newLine(); } else if (t.toString().equals("li")) { indentStack.pop(); newLine(); } else if (t.toString().equals("dd")) { indentStack.pop(); } } @Override public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) { log.info("SimpleTag:" + t.toString()); if (t.toString().equals("br")) { newLine(); } } @Override public void handleText(char[] text, int pos) { log.info("Text:" + new String(text)); stringBuffer.append(text); } public String getText() { return stringBuffer.toString(); } }
到此這篇關(guān)于Java實(shí)現(xiàn)提取HTML文件中的文本內(nèi)容的文章就介紹到這了,更多相關(guān)Java提取HTML文本內(nèi)容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器類實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器類,涉及java針對(duì)鍵盤監(jiān)聽及數(shù)字運(yùn)算的處理技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10SpringBoot如何使用Fastjson解析Json數(shù)據(jù)
這篇文章主要介紹了SpringBoot如何使用Fastjson解析Json數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03java實(shí)現(xiàn)簡(jiǎn)單快遞系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單快遞系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03dubbo如何設(shè)置連接zookeeper權(quán)限
這篇文章主要介紹了dubbo如何設(shè)置連接zookeeper權(quán)限問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05