Java識別和處理HTML標簽內容的常用方法
更新時間:2025年07月07日 09:49:57 作者:白大鍋
這篇文章總結了識別和處理HTML的幾種方法:推薦使用Jsoup處理復雜結構,因其功能強大且API友好;避免正則表達式和XML解析器處理嵌套標簽;需清理用戶輸入中的潛在安全風險,并注意字符編碼問題,需要的朋友可以參考下
1. 使用正則表達式(簡單場景)
適用于簡單的 HTML 標簽識別和提?。?/p>
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>";
// 匹配所有標簽
Pattern tagPattern = Pattern.compile("<[^>]+>");
Matcher tagMatcher = tagPattern.matcher(html);
System.out.println("所有HTML標簽:");
while (tagMatcher.find()) {
System.out.println(tagMatcher.group());
}
// 匹配特定標簽(如<a>標簽)
Pattern aTagPattern = Pattern.compile("<a\\b[^>]*>(.*?)</a>");
Matcher aTagMatcher = aTagPattern.matcher(html);
System.out.println("\n所有<a>標簽:");
while (aTagMatcher.find()) {
System.out.println("完整標簽: " + aTagMatcher.group(0));
System.out.println("標簽內容: " + aTagMatcher.group(1));
}
// 匹配標簽屬性
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));
}
}
}注意:正則表達式不適合處理復雜的、嵌套的 HTML 結構。
2. 使用 Jsoup(推薦)
Jsoup 是一個強大的 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);
// 獲取標題
System.out.println("標題: " + 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第一個段落的父元素: " + firstP.parent().tagName());
System.out.println("第一個段落的子元素數(shù)量: " + firstP.children().size());
}
}3. 使用 JDK 內置的 XML 解析器(適用于 XHTML)
對于格式良好的 XHTML,可以使用 JDK 內置的 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() + " 個段落:");
for (int i = 0; i < paragraphs.getLength(); i++) {
System.out.println(paragraphs.item(i).getTextContent());
}
}
}4. 使用 HTMLCleaner
HTMLCleaner 是另一個輕量級的 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 + " 個段落:");
for (TagNode p : paragraphs) {
System.out.println(p.getText().toString());
}
}
}5. 處理 HTML 文本(去除標簽)
如果只需要提取文本內容而不需要標簽結構:
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" + text);
// 簡單正則方法去除標簽(不推薦用于復雜HTML)
String textOnly = html.replaceAll("<[^>]+>", "");
System.out.println("\n簡單去除標簽后的文本:\n" + textOnly);
}
}最佳實踐建議
- 推薦使用 Jsoup:它功能強大、API友好,適合大多數(shù)HTML處理場景
- 避免使用正則處理復雜HTML:正則表達式難以正確處理嵌套標簽和格式不規(guī)范的HTML
- 注意HTML清理:當處理用戶輸入的HTML時,應該清理潛在的惡意內容
- 考慮性能:對于大量HTML處理,Jsoup的性能通常足夠好
- 處理編碼問題:確保正確處理HTML文檔的字符編碼
安全注意事項
當處理用戶提供的HTML內容時,務必考慮安全風險:
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);
}
}到此這篇關于Java識別和處理HTML標簽內容的常用方法的文章就介紹到這了,更多相關Java識別和處理HTML內容內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

