kaarbe/html-extractor:從HTML中提取文字的簡單Java庫
從具有HTML標記的輸入中提取文字。只會傳回包含在有效HTML標記中的文字。無效
* 標記、標記之間的文字以及不帶任何HTML的文字將在建立最終結果之前被刪除。
package com.github.kaarbe; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; public class HtmlExtractor { private static final String EMPTY_STRING = ""; private HtmlExtractor() { } public static String extract(final String input, final boolean shouldTrim) { if (!Validator.isValid(input)) { return EMPTY_STRING; } List<Character> chars = shouldTrim ? Trimmer.trim(toCharList(input)) : toCharList(input); int index = 0; while (mayContainHtmlTag(chars) && index < chars.size()) { HtmlTag firstTag = HtmlTag.findOne(0, chars); index = firstTag.getEndIndex(); HtmlTag secondTag = HtmlTag.findOne(index, chars); index = secondTag.getEndIndex(); while (!(firstTag.isOpening() && secondTag.isClosing())) { firstTag = secondTag; secondTag = HtmlTag.findOne(index, chars); index = secondTag.getEndIndex(); } chars = firstTag.isPairWith(secondTag) ? getWithoutTags(chars, firstTag, secondTag) : getWithoutTagsAndContent(chars, firstTag, secondTag); } return getWithoutRemainingTags(chars) .stream() .map(Objects::toString) .collect(Collectors.joining(EMPTY_STRING)); } private static List<Character> toCharList(final String text) { return text .chars() .mapToObj(codePointValue -> (char) codePointValue) .collect(Collectors.toList()); } private static boolean mayContainHtmlTag(final List<Character> chars) { return chars.contains('<') && chars.contains('>'); } private static List<Character> getWithoutTags( final List<Character> chars, final HtmlTag opening, final HtmlTag closing) { List<Character> beforeOpeningTag = chars.subList(0, opening.getStartIndex()); List<Character> inBetweenTags = chars.subList(opening.getEndIndex() + 1, closing.getStartIndex()); List<Character> afterClosingTag = chars.subList(closing.getEndIndex() + 1, chars.size()); List<Character> remainingTags = new ArrayList<>(beforeOpeningTag.size() + inBetweenTags.size() + afterClosingTag.size()); remainingTags.addAll(beforeOpeningTag); remainingTags.addAll(inBetweenTags); remainingTags.addAll(afterClosingTag); return remainingTags; } private static List<Character> getWithoutTagsAndContent( final List<Character> chars, final HtmlTag firstTag, final HtmlTag secondTag) { List<Character> remainingChars = new ArrayList<>(chars); remainingChars .subList(firstTag.getStartIndex(), secondTag.getEndIndex() + 1) .clear(); return remainingChars; } private static List<Character> getWithoutRemainingTags(final List<Character> chars) { if (!mayContainHtmlTag(chars)) { return chars; } List<Character> remainingChars = new ArrayList<>(chars); while (mayContainHtmlTag(remainingChars)) { int index = 0; HtmlTag tag = HtmlTag.findOne(index, remainingChars); index = tag.getEndIndex(); if (Identifier.isTagClosingChar(remainingChars.get(index))) { remainingChars .subList(tag.getStartIndex(), tag.getEndIndex() + 1) .clear(); } } return remainingChars; } } |
點選標題見完整程式碼
相關文章
- Java中用正則從HTML標籤中提取文字2種方法JavaHTML
- C#簡單的web網頁html抓取並提取指定a標籤連結C#Web網頁HTML
- 簡單聊聊Java中的ReentrantLockJavaReentrantLock
- 簡單的文字編輯
- HTML 文字格式化簡介HTML
- 從圖片提取文字的終極解決方法 ——【通用文字識別 API】API
- 短影片文案提取的簡單實現
- 超簡單的視訊物件提取程式物件
- Python lxml :從網頁HTML/XML提取資料PythonXML網頁HTML
- HTML input text單行文字域HTML
- java從字串中提取數字Java字串
- 有什麼簡單辦法從格式複雜的 Excel中提取資料Excel
- 提取圖片文字的技巧
- 錄音內容如何轉成文字?從音訊中提取文字的實用方法音訊
- HTML很簡單?不!HTML
- HTML簡單介紹HTML
- HTML 簡單介紹HTML
- 文章內容提取庫 goose 簡介Go
- OpenHarmony整合OCR三方庫實現文字提取
- JSON簡介(java中的json庫使用)JSONJava
- 簡單介紹java中的equals()方法Java
- 表格轉文字如何實現-表格文字識別介面整合示例-快速提取表格中的文字
- HTML簡單知識的總結HTML
- html中中文字型的程式碼HTML
- 如何用Python從PDF檔案中提取文字詞彙Python
- 高效的PDF文字提取技術
- 從連結中提取github倉庫名Github
- HTML之簡單標籤HTML
- vim技巧--提取文字與文字替換
- 簡單理解Java中的4種迴圈Java
- 先簡單說一說Java中的CopyOnWriteArrayListJava
- python 網頁文字提取Python網頁
- Java 在PPT中新增文字水印的簡易方法(單一/平鋪水印)Java
- java中資料庫查詢,搭配簡單的圖形介面進行查詢Java資料庫
- 提取圖片中文字的教程
- HTML5中的表單HTML
- 簡單瞭解下Java中鎖的概念和原理Java
- HTML簡單網頁製作HTML網頁