最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java識別和處理HTML標(biāo)簽內(nèi)容的常用方法

 更新時(shí)間:2025年07月07日 09:49:57   作者:白大鍋  
這篇文章總結(jié)了識別和處理HTML的幾種方法:推薦使用Jsoup處理復(fù)雜結(jié)構(gòu),因其功能強(qiáng)大且API友好;避免正則表達(dá)式和XML解析器處理嵌套標(biāo)簽;需清理用戶輸入中的潛在安全風(fēng)險(xiǎn),并注意字符編碼問題,需要的朋友可以參考下

1. 使用正則表達(dá)式(簡單場景)

適用于簡單的 HTML 標(biāo)簽識別和提取:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HtmlTagExtractor {
    public static void main(String[] args) {
        String html = "<div><p>Hello <b>World</b></p><a href='example.com'>Link</a></div>";
        
        // 匹配所有標(biāo)簽
        Pattern tagPattern = Pattern.compile("<[^>]+>");
        Matcher tagMatcher = tagPattern.matcher(html);
        
        System.out.println("所有HTML標(biāo)簽:");
        while (tagMatcher.find()) {
            System.out.println(tagMatcher.group());
        }
        
        // 匹配特定標(biāo)簽(如<a>標(biāo)簽)
        Pattern aTagPattern = Pattern.compile("<a\\b[^>]*>(.*?)</a>");
        Matcher aTagMatcher = aTagPattern.matcher(html);
        
        System.out.println("\n所有<a>標(biāo)簽:");
        while (aTagMatcher.find()) {
            System.out.println("完整標(biāo)簽: " + aTagMatcher.group(0));
            System.out.println("標(biāo)簽內(nèi)容: " + aTagMatcher.group(1));
        }
        
        // 匹配標(biāo)簽屬性
        Pattern attrPattern = Pattern.compile("\\b(href|src)=['\"]([^'\"]*)['\"]");
        Matcher attrMatcher = attrPattern.matcher(html);
        
        System.out.println("\n所有href/src屬性:");
        while (attrMatcher.find()) {
            System.out.println(attrMatcher.group(1) + " = " + attrMatcher.group(2));
        }
    }
}

注意:正則表達(dá)式不適合處理復(fù)雜的、嵌套的 HTML 結(jié)構(gòu)。

2. 使用 Jsoup(推薦)

Jsoup 是一個(gè)強(qiáng)大的 Java HTML 解析庫:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><head><title>Sample</title></head>"
                + "<body><div id='content'><p class='text'>First paragraph</p>"
                + "<p>Second <b>paragraph</b></p><a href='example.com'>Link</a></div></body></html>";
        
        // 解析HTML
        Document doc = Jsoup.parse(html);
        
        // 獲取標(biāo)題
        System.out.println("標(biāo)題: " + doc.title());
        
        // 獲取所有段落
        Elements paragraphs = doc.select("p");
        System.out.println("\n所有段落:");
        for (Element p : paragraphs) {
            System.out.println(p.text());
        }
        
        // 獲取特定ID的元素
        Element contentDiv = doc.getElementById("content");
        System.out.println("\nID為content的div:");
        System.out.println(contentDiv.html());
        
        // 獲取特定class的元素
        Elements textElements = doc.getElementsByClass("text");
        System.out.println("\nclass為text的元素:");
        for (Element el : textElements) {
            System.out.println(el.text());
        }
        
        // 獲取所有鏈接
        Elements links = doc.select("a[href]");
        System.out.println("\n所有鏈接:");
        for (Element link : links) {
            System.out.println("文本: " + link.text() + ", 鏈接: " + link.attr("href"));
        }
        
        // 獲取元素的父級和子級
        Element firstP = paragraphs.first();
        System.out.println("\n第一個(gè)段落的父元素: " + firstP.parent().tagName());
        System.out.println("第一個(gè)段落的子元素?cái)?shù)量: " + firstP.children().size());
    }
}

3. 使用 JDK 內(nèi)置的 XML 解析器(適用于 XHTML)

對于格式良好的 XHTML,可以使用 JDK 內(nèi)置的 XML 解析器:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class XmlParserExample {
    public static void main(String[] args) throws Exception {
        String xhtml = "<html><body><p>Paragraph 1</p><p>Paragraph 2</p></body></html>";
        
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new InputSource(new StringReader(xhtml)));
        
        // 獲取所有段落
        NodeList paragraphs = doc.getElementsByTagName("p");
        System.out.println("找到 " + paragraphs.getLength() + " 個(gè)段落:");
        
        for (int i = 0; i < paragraphs.getLength(); i++) {
            System.out.println(paragraphs.item(i).getTextContent());
        }
    }
}

4. 使用 HTMLCleaner

HTMLCleaner 是另一個(gè)輕量級的 HTML 解析庫:

import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;

public class HtmlCleanerExample {
    public static void main(String[] args) throws Exception {
        String html = "<html><body><div><p>Hello</p><p>World</p></div></body></html>";
        
        HtmlCleaner cleaner = new HtmlCleaner();
        TagNode rootNode = cleaner.clean(html);
        
        // 獲取所有段落
        TagNode[] paragraphs = rootNode.getElementsByName("p", true);
        System.out.println("找到 " + paragraphs.length + " 個(gè)段落:");
        
        for (TagNode p : paragraphs) {
            System.out.println(p.getText().toString());
        }
    }
}

5. 處理 HTML 文本(去除標(biāo)簽)

如果只需要提取文本內(nèi)容而不需要標(biāo)簽結(jié)構(gòu):

import org.jsoup.Jsoup;

public class HtmlTextExtractor {
    public static void main(String[] args) {
        String html = "<div><p>Hello <b>World</b></p><a href='example.com'>Link</a></div>";
        
        // 使用Jsoup提取文本
        String text = Jsoup.parse(html).text();
        System.out.println("純文本內(nèi)容:\n" + text);
        
        // 簡單正則方法去除標(biāo)簽(不推薦用于復(fù)雜HTML)
        String textOnly = html.replaceAll("<[^>]+>", "");
        System.out.println("\n簡單去除標(biāo)簽后的文本:\n" + textOnly);
    }
}

最佳實(shí)踐建議

  • 推薦使用 Jsoup:它功能強(qiáng)大、API友好,適合大多數(shù)HTML處理場景
  • 避免使用正則處理復(fù)雜HTML:正則表達(dá)式難以正確處理嵌套標(biāo)簽和格式不規(guī)范的HTML
  • 注意HTML清理:當(dāng)處理用戶輸入的HTML時(shí),應(yīng)該清理潛在的惡意內(nèi)容
  • 考慮性能:對于大量HTML處理,Jsoup的性能通常足夠好
  • 處理編碼問題:確保正確處理HTML文檔的字符編碼

安全注意事項(xiàng)

當(dāng)處理用戶提供的HTML內(nèi)容時(shí),務(wù)必考慮安全風(fēng)險(xiǎn):

import org.jsoup.Jsoup;
import org.jsoup.safety.Safelist;

public class HtmlSanitizer {
    public static void main(String[] args) {
        String unsafeHtml = "<div onclick='alert(\"xss\")'>Hello<script>alert('xss')</script><a href='javascript:alert(1)'>Link</a></div>";
        
        // 基本清理,只允許文本
        String safeText = Jsoup.clean(unsafeHtml, Safelist.none());
        System.out.println("僅文本:\n" + safeText);
        
        // 允許基本格式和安全的鏈接
        String basicHtml = Jsoup.clean(unsafeHtml, Safelist.basic());
        System.out.println("\n基本HTML:\n" + basicHtml);
        
        // 自定義白名單
        Safelist customList = Safelist.basic()
            .addTags("div", "span")
            .addAttributes("div", "class");
        String customClean = Jsoup.clean(unsafeHtml, customList);
        System.out.println("\n自定義清理:\n" + customClean);
    }
}

到此這篇關(guān)于Java識別和處理HTML標(biāo)簽內(nèi)容的常用方法的文章就介紹到這了,更多相關(guān)Java識別和處理HTML內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決JavaWeb讀取本地json文件以及亂碼的問題

    解決JavaWeb讀取本地json文件以及亂碼的問題

    今天小編就為大家分享一篇解決JavaWeb讀取本地json文件以及亂碼的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 一文教你如何使用AES對接口參數(shù)進(jìn)行加密

    一文教你如何使用AES對接口參數(shù)進(jìn)行加密

    這篇文章主要是想為大家介紹一下如何使用AES實(shí)現(xiàn)對接口參數(shù)進(jìn)行加密,文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,需要的小伙伴可以了解一下
    2023-08-08
  • Java設(shè)計(jì)模式之建造者模式(Builder模式)介紹

    Java設(shè)計(jì)模式之建造者模式(Builder模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之建造者模式(Builder模式)介紹,本文講解了為何使用建造者模式、如何使用建造者模式、Builder模式的應(yīng)用等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • mybatis如何處理返回結(jié)果集

    mybatis如何處理返回結(jié)果集

    這篇文章主要介紹了mybatis如何處理返回結(jié)果集問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java利用Spire.XLS for Java實(shí)現(xiàn)自動化生成PDF文檔

    Java利用Spire.XLS for Java實(shí)現(xiàn)自動化生成PDF文檔

    在 Java 后端高效靈活地實(shí)現(xiàn) PDF 文檔的生成,常常是困擾開發(fā)者的一個(gè)痛點(diǎn),本文將為您介紹如何利用 Spire.XLS for Java 輕松駕馭 Java 中的 PDF 文檔生成,感興趣的小伙伴可以了解下
    2026-02-02
  • Java 不使用第三方變量交換兩個(gè)變量值的四種方法詳解

    Java 不使用第三方變量交換兩個(gè)變量值的四種方法詳解

    這篇文章主要介紹了四種不使用第三方變量交換兩個(gè)變量值的方法。文中對于四種方法進(jìn)行了詳細(xì)的分析,需要的小伙伴們可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • SpringBoot中LogBack日志配置與多環(huán)境實(shí)戰(zhàn)

    SpringBoot中LogBack日志配置與多環(huán)境實(shí)戰(zhàn)

    在現(xiàn)代軟件開發(fā)中,日志記錄是不可或缺的一部分,Spring Boot 提供了多種日志框架的支持,其中 Logback 是一個(gè)非常流行的選擇,因?yàn)樗唵?、高效且功能?qiáng)大,本文將介紹如何在 Spring Boot 項(xiàng)目中配置 Logback,并實(shí)現(xiàn)不同環(huán)境下的日志配置,需要的朋友可以參考下
    2025-01-01
  • 擴(kuò)展Hibernate使用自定義數(shù)據(jù)庫連接池的方法

    擴(kuò)展Hibernate使用自定義數(shù)據(jù)庫連接池的方法

    這篇文章主要介紹了擴(kuò)展Hibernate使用自定義數(shù)據(jù)庫連接池的方法,涉及Hibernate數(shù)據(jù)庫操作擴(kuò)展的相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • Java經(jīng)典設(shè)計(jì)模式之觀察者模式原理與用法詳解

    Java經(jīng)典設(shè)計(jì)模式之觀察者模式原理與用法詳解

    這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之觀察者模式,簡單分析了觀察者模式的概念、原理并結(jié)合實(shí)例形式給出了java觀察者模式的具體用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • SpringBoot 統(tǒng)一異常處理詳解

    SpringBoot 統(tǒng)一異常處理詳解

    這篇文章主要介紹了SpringBoot統(tǒng)一異常處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論

新田县| 洪雅县| 香河县| 广德县| 思南县| 阿图什市| 莱州市| 顺昌县| 灵武市| 海安县| 石嘴山市| 巴南区| 垦利县| 措勤县| 绵阳市| 罗平县| 达州市| 昆山市| 喜德县| 金门县| 咸阳市| 勃利县| 福鼎市| 浙江省| 弥渡县| 万源市| 沅江市| 惠东县| 闻喜县| 嘉峪关市| 邛崃市| 和田县| 岳池县| 浠水县| 庆安县| 沙雅县| 多伦县| 泌阳县| 农安县| 屏边| 旅游|