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; } } |
點選標題見完整程式碼
相關文章
- 從 HTML 提取文字的 7 個工具HTML
- Java中用正則從HTML標籤中提取文字2種方法JavaHTML
- htmlparsing: 純淨簡單的 HTML 解析庫HTML
- java 提取字串或一段文字中的手機號碼Java字串
- swift——富文字文字的簡單使用Swift
- C#簡單的web網頁html抓取並提取指定a標籤連結C#Web網頁HTML
- html中註釋簡單介紹HTML
- 簡單htmlHTML
- 從圖片提取文字的終極解決方法 ——【通用文字識別 API】API
- 使用 Linux 文字工具簡化資料的提取(轉)Linux
- 簡單的文字處理
- 超簡單的視訊物件提取程式物件
- 短影片文案提取的簡單實現
- 簡單聊聊Java中的ReentrantLockJavaReentrantLock
- java從字串中提取數字Java字串
- HTML 文字格式化簡介HTML
- 有什麼簡單辦法從格式複雜的 Excel中提取資料Excel
- 使用Linux文字工具簡化資料的提取(一)(轉)Linux
- HTML input text單行文字域HTML
- 錄音內容如何轉成文字?從音訊中提取文字的實用方法音訊
- Python lxml :從網頁HTML/XML提取資料PythonXML網頁HTML
- 簡單介紹java中的equals()方法Java
- 最簡單的JAVA連線資料庫Java資料庫
- 表格轉文字如何實現-表格文字識別介面整合示例-快速提取表格中的文字
- 從一個簡單的Java單例示例談談併發Java單例
- 文章內容提取庫 goose 簡介Go
- 如何用Python從PDF檔案中提取文字詞彙Python
- 提取資料夾中.lib檔名到文字中
- OpenHarmony整合OCR三方庫實現文字提取
- HTML簡單介紹HTML
- HTML很簡單?不!HTML
- HTML 簡單介紹HTML
- 高效的PDF文字提取技術
- html中中文字型的程式碼HTML
- 先簡單說一說Java中的CopyOnWriteArrayListJava
- 簡單理解Java中的4種迴圈Java
- Java中的簡單工廠設計模式Java設計模式
- vim技巧--提取文字與文字替換