PHP中使用DOMDocument來(lái)處理HTML、XML文檔的示例
其實(shí)從PHP5開(kāi)始,PHP就為我們提供了一個(gè)強(qiáng)大的解析和生成XML相關(guān)操作的類(lèi),也就是我們今天要講的 DOMDocument 類(lèi)。不過(guò)我估計(jì)大部分人在爬取網(wǎng)頁(yè)時(shí)還是會(huì)喜歡用正則去解析網(wǎng)頁(yè)內(nèi)容,學(xué)了今天的這個(gè)類(lèi)下回就可以嘗試下使用這個(gè)PHP自帶的方式來(lái)進(jìn)行解析分析了。
解析HTML
// 解析 HTML
$baidu = file_get_contents('https://www.baidu.com');
$doc = new DOMDocument();
@$doc->loadHTML($baidu);
// 百度輸出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);
// object(DOMElement)#2
// ....
echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
// 獲取所有圖片的鏈接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
$allImageLinks[] = $img->getAttribute('src');
}
print_r($allImageLinks);
// Array
// (
// [0] => //www.baidu.com/img/baidu_jgylogo3.gif
// [1] => //www.baidu.com/img/bd_logo.png
// [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )
// 利用 parse_url 分析鏈接
foreach($allImageLinks as $link){
print_r(parse_url($link));
}
// Array
// (
// [host] => www.baidu.com
// [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
// [host] => www.baidu.com
// [path] => /img/bd_logo.png
// )
// Array
// (
// [scheme] => http
// [host] => s1.bdstatic.com
// [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )
是不是感覺(jué)好清晰,好有面向?qū)ο蟮母杏X(jué)。就像第一次使用 ORM庫(kù) 來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作一樣的感覺(jué)。我們一段一段來(lái)看。
$baidu = file_get_contents('https://www.baidu.com');
$doc = new DOMDocument();
@$doc->loadHTML($baidu);
首先是加載文檔內(nèi)容,這個(gè)比較好理解,直接使用 loadHTML() 方法加載 HTML 內(nèi)容。它還提供了其它的幾個(gè)方法,分別是:load() 從一個(gè)文件加載XML;loadXML() 從字符串加載XML;loadHTMLFile() 從文件加載HTML。
// 百度輸出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);
// object(DOMElement)#2
// ....
echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
首先是加載文檔內(nèi)容,這個(gè)比較好理解,直接使用 loadHTML() 方法加載 HTML 內(nèi)容。它還提供了其它的幾個(gè)方法,分別是:load() 從一個(gè)文件加載XML;loadXML() 從字符串加載XML;loadHTMLFile() 從文件加載HTML。
// 百度輸出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);
// object(DOMElement)#2
// ....
echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
接下來(lái)我們使用和前端 JS 一樣的 DOM 操作API來(lái)操作HTML里面的元素。這個(gè)例子中就是獲取百度的文本框,直接使用 getElementById() 方法獲得id為指定內(nèi)容的 DOMElement 對(duì)象。然后就可以獲取它的值、屬性之類(lèi)的內(nèi)容了。
// 獲取所有圖片的鏈接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
$allImageLinks[] = $img->getAttribute('src');
}
print_r($allImageLinks);
// Array
// (
// [0] => //www.baidu.com/img/baidu_jgylogo3.gif
// [1] => //www.baidu.com/img/bd_logo.png
// [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )
// 利用 parse_url 分析鏈接
foreach($allImageLinks as $link){
print_r(parse_url($link));
}
// Array
// (
// [host] => www.baidu.com
// [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
// [host] => www.baidu.com
// [path] => /img/bd_logo.png
// )
// Array
// (
// [scheme] => http
// [host] => s1.bdstatic.com
// [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )
這一段例子則是獲取HTML文檔中所有的圖片鏈接。相比正則來(lái)說(shuō),是不是方便很多,而且代碼本身就是自解釋的,不用考慮正則的匹配失效的問(wèn)題。配合另外一個(gè)PHP中自帶的 parse_url() 方法也能非常方便地對(duì)鏈接進(jìn)行分析,提取自己想要的內(nèi)容。
XML的解析和對(duì)HTML的解析也是類(lèi)似的,都使用 DOMDocument 和 DOMElement 提供的這個(gè)方法接口就可以很方便的進(jìn)行解析了。那么我們想要生成一個(gè)標(biāo)準(zhǔn)格式的XML呢?當(dāng)然也非常的簡(jiǎn)單,不需要再去拼接字符串了,使用這個(gè)類(lèi)一樣的進(jìn)行對(duì)象化的操作。
生成一個(gè)XML
// 生成一個(gè)XML文檔
$xml = new DOMDocument('1.0', 'UTF-8');
$node1 = $xml->createElement('First', 'This is First Node.');
$node1->setAttribute('type', '1');
$node2 = $xml->createElement('Second');
$node2->setAttribute('type', '2');
$node2_child = $xml->createElement('Second-Child', 'This is Second Node Child.');
$node2->appendChild($node2_child);
$xml->appendChild($node1);
$xml->appendChild($node2);
print $xml->saveXML();
/*
<?xml version="1.0" encoding="UTF-8"?>
<First type="1">This is First Node.</First>
<Second type="2"><Second-Child>This is Second Node Child.</Second-Child></Second>
*/
其實(shí)只要有一點(diǎn)點(diǎn)的前端 JS 的基礎(chǔ)都不難看出這段代碼的含義。使用 createElement() 方法創(chuàng)造 DOMElement 對(duì)象,然后就可以為它添加屬性和內(nèi)容。使用 appendChild() 方法就可以為當(dāng)前的 DOMElement 或者 DOMDocument 添加下級(jí)節(jié)點(diǎn)。最后使用 saveXML() 就能夠生成標(biāo)準(zhǔn)的XML格式內(nèi)容了。
總結(jié)
通過(guò)上面兩個(gè)簡(jiǎn)單的小例子,相信大家已經(jīng)對(duì)這個(gè) DOMDocument 操作XML類(lèi)文件解析的方式非常感興趣了。不過(guò)相對(duì)于正則解析的方式它們的性能有多大的差異并沒(méi)有找到相關(guān)的測(cè)試,不過(guò)一般正常的情況下網(wǎng)站的HMTL文檔都不會(huì)太大,畢竟各個(gè)網(wǎng)站也會(huì)考慮自身的加載速度,如果文檔非常大的話(huà)用戶(hù)體驗(yàn)也會(huì)很差,所以這套接口用來(lái)進(jìn)行日常爬蟲(chóng)的分析處理工作基本是沒(méi)有任何問(wèn)題的。
測(cè)試代碼: github.com/zhangyue050…
以上就是PHP中使用DOMDocument來(lái)處理HTML、XML文檔的示例的詳細(xì)內(nèi)容,更多關(guān)于PHP DOMDocument處理HTML、XML的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- PHP使用DOMDocument類(lèi)生成HTML實(shí)例(包含常見(jiàn)標(biāo)簽元素)
- 如何解決php domdocument找不到的問(wèn)題
- PHP讀取XML文件的方法實(shí)例總結(jié)【DOMDocument及simplexml方法】
- PHP創(chuàng)建XML的方法示例【基于DOMDocument類(lèi)及SimpleXMLElement類(lèi)】
- PHP基于DOMDocument解析和生成xml的方法分析
- PHP 中 DOMDocument保存xml時(shí)中文出現(xiàn)亂碼問(wèn)題的解決方案
- php中DOMDocument簡(jiǎn)單用法示例代碼(XML創(chuàng)建、添加、刪除、修改)
- PHP XML操作類(lèi)DOMDocument
- php基于DOMDocument操作頁(yè)面元素實(shí)例
相關(guān)文章
PHP函數(shù)spl_autoload_register()用法和__autoload()介紹
又是框架沖突導(dǎo)致__autoload()失效,用spl_autoload_register()重構(gòu)一下,問(wèn)題解決2012-02-02
php實(shí)現(xiàn)連接access數(shù)據(jù)庫(kù)并轉(zhuǎn)txt寫(xiě)入的方法
這篇文章主要介紹了php實(shí)現(xiàn)連接access數(shù)據(jù)庫(kù)并轉(zhuǎn)txt寫(xiě)入的方法,涉及php連接、讀取access數(shù)據(jù)庫(kù)及寫(xiě)入txt文件的相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
說(shuō)明的比較細(xì)的php 正則學(xué)習(xí)實(shí)例
首先,讓我們看看兩個(gè)特別的字符:’^’ 和 ‘$’ 他們是分別用來(lái)匹配字符串的開(kāi)始和結(jié)束,一下分別舉例說(shuō)明2008-07-07
phpMyAdmin通過(guò)密碼漏洞留后門(mén)文件
今天小編就為大家分享一篇關(guān)于phpMyAdmin通過(guò)密碼漏洞留后門(mén)文件,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-11-11
php獲取從百度搜索進(jìn)入網(wǎng)站的關(guān)鍵詞的詳細(xì)代碼
以下是關(guān)于php該如何獲取從百度搜索進(jìn)入網(wǎng)站的關(guān)鍵詞的詳細(xì)代碼,希望本文對(duì)廣大php開(kāi)發(fā)者有所幫助2014-01-01

