網頁爬蟲與數據清洗中,HTML 解析是核心環節。HtmlCleaner 是一款輕量、容錯性極強的 Java HTML 解析器,支援 **DOM 風格 API** 與 **XPath 查詢**,能將不規範 HTML 修正為 Well-Formed 結構。本文詳解 HtmlCleaner 核心 API、XPath 語法速查表,並以**維基百科中國機場列表**為實戰案例演示完整抓取流程。
HtmlCleaner cleaner = new HtmlCleaner();
// 1. 解析來源:File / URL / String
TagNode root = cleaner.clean(new File("page.html"), "UTF-8");
TagNode root = cleaner.clean(new URL("https://example.com"));
TagNode root = cleaner.clean(htmlString);
// 2. 選取節點
// 按 tag 名稱
TagNode[] tags = root.getElementsByName("a", true);
// 按屬性值
TagNode[] tags = root.getElementsByAttValue("class", "target", true, true);
// 按 XPath(最強大、推薦)
Object[] nodes = root.evaluateXPath("//div[@class='content']//a[@href]");
| 表達式 | 含義 |
|---|---|
nodename | 選取所有該名稱的子節點 |
/ | 從根節點選取 |
// | 從任意位置選取匹配節點(後代) |
. | 當前節點 |
.. | 父節點 |
@attr | 選取屬性 |
//a[@href] | 所有擁有 href 屬性的 <a> 標籤 |
//div[@class='box'] | class="box" 的所有 <div> |
//table//tr[position()<3] | 每個 table 的前兩行 |
//a[contains(text(),'下載')] | 文字包含「下載」的連結 |
目標頁面:https://zh.wikipedia.org/wiki/中華人民共和國機場列表
public class AirportCrawler {
private static final String URL = "https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9C%8B%E6%A9%9F%E5%A0%B4%E5%88%97%E8%A1%A8";
private static final String XPATH_TABLE_ROWS = "//div[@id='mw-content-text']//table[contains(@class,'wikitable')]//tr[td]";
public static void main(String[] args) throws Exception {
String html = HttpClientUtil.get(URL); // 需自行實作或用 OkHttp/Jsoup
HtmlCleaner cleaner = new HtmlCleaner();
TagNode root = cleaner.clean(html);
Object[] rows = root.evaluateXPath(XPATH_TABLE_ROWS);
for (Object rowObj : rows) {
TagNode row = (TagNode) rowObj;
// 機場名稱通常在第一個 td 的 a 標籤
Object[] nameNodes = row.evaluateXPath(".//td[1]//a");
if (nameNodes.length > 0) {
String name = ((TagNode) nameNodes[0]).getText().toString().trim();
System.out.println(name);
}
}
}
}
TagNodeVisitor 進行樹遍歷轉換。new PrettyXmlSerializer(cleaner.getProperties()).writeToFile(root, "out.xml", "UTF-8")。DomSerializer 轉為標準 DOM 再用 JDK XPath,或改用 **Jsoup**(CSS Selector 更直觀、效能更優)。| 特性 | HtmlCleaner | Jsoup | JDK XPath |
|---|---|---|---|
| 容錯性 | 極強 | 強 | 需 Well-Formed XML |
| 選擇器 | XPath + DOM API | CSS Selector (極優) | XPath 1.0 |
| 依賴大小 | ~300 KB | ~500 KB | JDK 內建 |
| 維護狀態 | 低頻更新 | 活躍 | 標準 |
| 推薦場景 | 極度髒亂 HTML、需 XPath | 現代爬蟲首選 | 標準 XML 文檔 |
掌握 HtmlCleaner 與 XPath,能應對絕大多數非標準 HTML 解析需求;新專案建議優先評估 Jsoup。