小編給大家分享一下PHP中怎么使用DOMDocument來處理HTML、XML文檔,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)公司為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)公司核心團隊10年專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗,為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。
PHP中使用DOMDocument來處理HTML、XML文檔
// 解析 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] => /upload/otherpic50/141560.jpg // ) // 利用 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 // )
是不是感覺好清晰,好有面向?qū)ο蟮母杏X。就像第一次使用 ORM庫 來進行數(shù)據(jù)庫操作一樣的感覺。我們一段一段來看。
$baidu = file_get_contents('https://www.baidu.com'); $doc = new DOMDocument(); @$doc->loadHTML($baidu);
首先是加載文檔內(nèi)容,這個比較好理解,直接使用 loadHTML() 方法加載 HTML 內(nèi)容。它還提供了其它的幾個方法,分別是:load() 從一個文件加載XML;loadXML() 從字符串加載XML;loadHTMLFile() 從文件加載HTML。
// 百度輸出框 $inputSearch = $doc->getElementById('kw'); var_dump($inputSearch); // object(DOMElement)#2 // .... echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
接下來我們使用和前端 JS 一樣的 DOM 操作API來操作HTML里面的元素。這個例子中就是獲取百度的文本框,直接使用 getElementById() 方法獲得id為指定內(nèi)容的 DOMElement 對象。然后就可以獲取它的值、屬性之類的內(nèi)容了。
【相關(guān)推薦:PHP視頻教程】
// 獲取所有圖片的鏈接 $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] => /upload/otherpic50/141560.jpg // ) // 利用 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文檔中所有的圖片鏈接。相比正則來說,是不是方便很多,而且代碼本身就是自解釋的,不用考慮正則的匹配失效的問題。配合另外一個PHP中自帶的 parse_url() 方法也能非常方便地對鏈接進行分析,提取自己想要的內(nèi)容。
XML的解析和對HTML的解析也是類似的,都使用 DOMDocument 和 DOMElement 提供的這個方法接口就可以很方便的進行解析了。那么我們想要生成一個標(biāo)準(zhǔn)格式的XML呢?當(dāng)然也非常的簡單,不需要再去拼接字符串了,使用這個類一樣的進行對象化的操作。
// 生成一個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(); /*This is First Node. */ This is Second Node Child.
其實只要有一點點的前端 JS 的基礎(chǔ)都不難看出這段代碼的含義。使用 createElement() 方法創(chuàng)造 DOMElement 對象,然后就可以為它添加屬性和內(nèi)容。使用 appendChild() 方法就可以為當(dāng)前的 DOMElement 或者 DOMDocument 添加下級節(jié)點。最后使用 saveXML() 就能夠生成標(biāo)準(zhǔn)的XML格式內(nèi)容了。
通過上面兩個簡單的小例子,相信大家已經(jīng)對這個 DOMDocument 操作XML類文件解析的方式非常感興趣了。不過相對于正則解析的方式它們的性能有多大的差異并沒有找到相關(guān)的測試,不過一般正常的情況下網(wǎng)站的HMTL文檔都不會太大,畢竟各個網(wǎng)站也會考慮自身的加載速度,如果文檔非常大的話用戶體驗也會很差,所以這套接口用來進行日常爬蟲的分析處理工作基本是沒有任何問題的。
測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/PHP%E4%B8%AD%E4%BD%BF%E7%94%A8DOMDocument%E6%9D%A5%E5%A4%84%E7%90%86HTML%E3%80%81XML%E6%96%87%E6%A1%A3.php
看完了這篇文章,相信你對“PHP中怎么使用DOMDocument來處理HTML、XML文檔”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!