首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

HtmlCleaner 解析 HTML 實戰指南:XPath 語法詳解與維基百科機場數據抓取範例

     編輯:Java 相關知識

網頁爬蟲與數據清洗中,HTML 解析是核心環節。HtmlCleaner 是一款輕量、容錯性極強的 Java HTML 解析器,支援 **DOM 風格 API** 與 **XPath 查詢**,能將不規範 HTML 修正為 Well-Formed 結構。本文詳解 HtmlCleaner 核心 API、XPath 語法速查表,並以**維基百科中國機場列表**為實戰案例演示完整抓取流程。

一、HtmlCleaner 核心 API 速覽

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]");

二、XPath 語法核心速查表

表達式含義
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);
            }
        }
    }
}

四、HtmlCleaner 進階技巧

  • 自訂 TagNode 處理器: 實作 TagNodeVisitor 進行樹遍歷轉換。
  • 序列化為 XML: new PrettyXmlSerializer(cleaner.getProperties()).writeToFile(root, "out.xml", "UTF-8")。
  • 效能優化: 大文檔建議使用 DomSerializer 轉為標準 DOM 再用 JDK XPath,或改用 **Jsoup**(CSS Selector 更直觀、效能更優)。
  • 編碼處理: 清楚指定 `clean(html, "UTF-8")`,避免中文亂碼。

五、對比:HtmlCleaner vs Jsoup vs XPath (JDK)

特性HtmlCleanerJsoupJDK XPath
容錯性極強強需 Well-Formed XML
選擇器XPath + DOM APICSS Selector (極優)XPath 1.0
依賴大小~300 KB~500 KBJDK 內建
維護狀態低頻更新活躍標準
推薦場景極度髒亂 HTML、需 XPath現代爬蟲首選標準 XML 文檔

掌握 HtmlCleaner 與 XPath,能應對絕大多數非標準 HTML 解析需求;新專案建議優先評估 Jsoup。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved