為什麼選擇它?
原生 DOMDocument + DOMXPath 雖強大但 API 繁瑣、容錯差(嚴格要求合法 XML/HTML)。PHP Simple HTML DOM Parser 提供:
- jQuery 風格 CSS 選擇器(
find('div.content a'))。
- 極強容錯(自動修補斷標籤、編碼自動檢測)。
- 鏈式操作、DOM 遍歷、屬性/文本/註釋提取一站式。
- 支援字符串、URL、文件三種來源創建 DOM。
安裝與引入
// 方式 1:Composer (推薦,現代項目)
composer require sunra/php-simple-html-dom-parser
// 方式 2:手動下載 simple_html_dom.php 放入項目
include_once 'simple_html_dom.php';
三種創建 DOM 對象方式
<?php
// 1. 從字符串
$html = str_get_html('<html><body>Hello!</body></html>');
// 2. 從 URL 直接抓取(內部用 file_get_contents/curl)
$html = file_get_html('https://example.com/article');
// 3. 從本地文件
$html = file_get_html('storage/page.html');
核心 API:find() 選擇器大全
| 代碼 | 說明 | 返回類型 |
$html->find('a') | 所有 <a> 標籤 | 元素對象陣列 |
$html->find('a', 0) | 第 1 個 <a> (0-based) | 單個元素對象 / null |
$html->find('a', -1) | 最後一個 <a> | 單個元素對象 / null |
$html->find('div[id]') | 有 id 屬性的 <div> | 陣列 |
$html->find('div[id=main]') | id=main 的 <div> | 陣列 |
$html->find('.content .title') | 後代選擇器 | 陣列 |
$html->find('#main > ul > li') | 子代選擇器 | 陣列 |
$html->find('img[data-src]') | 屬性存在選擇器 | 陣列 |
$html->find('text') | 所有文本節點(特殊) | 陣列 |
$html->find('comment') | 所有註釋節點 (特殊) | 陣列 |
元素對象常用屬性與方法
$el = $html->find('div.article', 0);
// 屬性
$el->href; // 獲取 href 屬性 (若為 <a>)
$el->src; // 獲取 src
$el->id; // 獲取 id
$el->class; // 獲取 class
$el->tag; // 標籤名 'div'
$el->outertext; // 含標籤的完整 HTML
$el->innertext; // 內部 HTML
$el->plaintext; // 純文本 (去標籤)
// 方法
$el->getAttribute('data-id'); // 通用獲取屬性
$el->children(); // 直接子元素陣列
$el->parent(); // 父元素
$el->next_sibling(); // 下一個同級
$el->prev_sibling(); // 上一個同級
鏈式操作與遍歷實戰
// 鏈式:找到 #div1 -> 第 2 個子元素 -> 第 2 個子元素 -> 第 3 個子元素 -> 取 id
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
// 等價 DOM 標準寫法
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');
// 遍歷所有圖片鏈接
foreach ($html->find('img') as $img) {
echo $img->src . '<br>';
}
// 修改 DOM 並輸出
$html->find('a.external', 0)->href = 'https://new-target.com';
$html->find('a.external', 0)->target = '_blank';
echo $html->save(); // 輸出修改後的完整 HTML
進階技巧與避坑
- 編碼處理:抓取遠程頁面時,庫會嘗試從
Content-Type 或 <meta charset> 檢測編碼。若檢測失敗導致亂碼,可強制指定:$html = file_get_html($url, false, null, -1, 'UTF-8');(參考庫版本參數)。
- 內存佔用:大頁面(>2MB)解析較佔內存。爬蟲建議:
stream_get_contents 分塊讀取 + 正則預提取目標區塊 -> 再餵給解析器。
- 現代替代品:symfony/dom-crawler (配合
CssSelector 組件)、**Masterminds/HTML5-PHP** (標準 HTML5 解析器)、**wa72/htmlpagedom** (DOMDocument 封裝,輕量)。新項目優先考慮標準庫封裝。
- 清理資源:循環解析大量頁面時,及時
unset($html); $html = null; 釋放循環引用內存。
總結
PHP Simple HTML DOM Parser 以「jQuery 風格選擇器 + 強容錯」降低了 PHP 解析 HTML 的門檻,是快速開發爬蟲、內容提取、頁面清洗的利器。理解其 find() 選擇器語法、元素對象屬性、鏈式遍歷,即可應對 95% 解析場景。
- 上一篇文章: 跨瀏覽器網頁灰度效果實現:CSS Filter + JavaScript 降級方案
- 下一篇文章: PHP 多級目錄 Session 存儲配置實戰:突破文件數限制、自動創建目錄結構、hash_bits_per_character 陷阱
Copyright ©
程式碼之家 All Rights Reserved