simple_html_dom 是一套純 PHP 實作的 HTML DOM 解析器,特色:
<?php
require_once 'simple_html_dom.php'; // 需先下載並引入
$html = new simple_html_dom();
// 1. 從 URL 載入
$html->load_file('https://example.com');
// 2. 從字串載入
$html->load('<html><body>Hello</body></html>');
// 3. 從本地檔案載入
$html->load_file('path/to/file.html');
?>
建議:抓取遠端網頁時,優先使用 cURL 取得內容後再 load(),可控制逾時、Header、Cookie 等細節。
find() 方法詳解回傳元素物件陣列,若指定索引則回傳單一物件或 null。
<?php
// 所有 <a>
$links = $html->find('a');
// 第 1 個 <a> (索引 0)
$firstLink = $html->find('a', 0);
// id="main" 的 <div>
$main = $html->find('div[id=main]', 0);
// 所有有 id 屬性的 <div>
$divs = $html->find('div[id]');
// 所有有 id 屬性的元素
$allWithId = $html->find('[id]');
// 類 jQuery 選擇器
$container = $html->find('#container');
$fooItems = $html->find('.foo');
$multi = $html->find('a, img');
$attrSel = $html->find('a[title], img[title]');
// 子元素查找
$listItems = $html->find('ul li');
$selected = $html->find('ul li.selected');
?>
<?php
$e = $html->find('#someId', 0);
$e->parent; // 父元素
$e->children; // 所有子元素陣列
$e->children(0); // 第 1 個子元素
$e->first_child(); // 第一個子元素
$e->last_child(); // 最後一個子元素
$e->prev_sibling(); // 上一個同層元素
$e->next_sibling(); // 下一個同層元素
?>
$link = $a->href; // 直接存取屬性
$link = $html->find('a', 0)->href; // 串聯寫法
| 屬性 | 說明 |
|---|---|
tag | 標籤名稱 |
innertext | innerHTML |
outertext | outerHTML |
plaintext | 純文字內容(去除標籤) |
$a->href = 'https://new-url.com'; // 修改
$a->href = null; // 刪除
if (isset($a->href)) { ... } // 判斷是否存在
// 包裹
$e->outertext = '<div class="wrap">' . $e->outertext . '</div>';
// 刪除
$e->outertext = '';
// 尾部插入
$e->outertext .= '<div>foo</div>';
// 頭部插入
$e->outertext = '<div>foo</div>' . $e->outertext;
<?php
// 直接輸出整份文件
echo $html;
// 或指定元素輸出
echo $html->find('#content', 0);
// 【重要】用畢釋放記憶體,避免大量解析導致 OOM
$html->clear();
unset($html);
?>
解析器內部建立大量物件樹,處理多份文件時務必呼叫 clear(),否則記憶體會持續增長導致腳本中止。
| 語法 | 說明 |
|---|---|
[attr] | 包含該屬性 |
[attr=val] | 屬性值等於 val |
[attr!=val] | 屬性值不等於 val |
[attr^=val] | 屬性值以 val 開頭 |
[attr$=val] | 屬性值以 val 結尾 |
[attr*=val] | 屬性值包含 val |