PHP使用DOMDocument采集

采集是很多公司都做最的一件事,能夠快速的獲取別人辛苦得來的數(shù)據(jù),雖為不道義,但無法禁止!

創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站制作與策劃設(shè)計(jì),柯橋網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:柯橋等地區(qū)??聵蜃鼍W(wǎng)站價(jià)格咨詢:18982081108

PHP采集一般方式有:

  1. 正則采集。

  2. 使用DOM對(duì)象采集。

  3. 使用字符串函數(shù)提取。

這里只說下DOM對(duì)象采集的一些問題:

PHP有DOM對(duì)象專門用來處理HTML或XML文件,非常方便。

$dom = new DOMDocument('1.0','GBK');//創(chuàng)建DOM對(duì)象
@$dom->loadHTMLFile($url);//加載對(duì)應(yīng)的URL地址HTML內(nèi)容
$xpath=new DOMXPath($dom);//創(chuàng)建DOMXPath對(duì)象

DOMXPath對(duì)象是一個(gè)支持 XPath 路徑表達(dá)式,http://www.w3school.com.cn/xpath/

XPath 路徑表達(dá)式類似 JQuery選擇器一樣,可以方便的找到對(duì)應(yīng)的節(jié)點(diǎn)然后提取內(nèi)容,當(dāng)然 XPath 的選擇方式要遠(yuǎn)比 JQuery 多。而且還支持很多種函數(shù)處理。

注意:

@$dom->loadHTMLFile($url);//加載對(duì)應(yīng)的URL地址HTML內(nèi)容

這句代碼前面最好加上 @ 符號(hào),因?yàn)樵诩虞d解析HTML內(nèi)容時(shí),或多或少會(huì)出現(xiàn)錯(cuò)誤,如:在HTML頁面內(nèi)一些 & 符號(hào)要轉(zhuǎn)義成 & ,html實(shí)體符號(hào)必須以 ;結(jié)束等等 才能順利解析。而這類要求在采集過程中是不可能的。

采集過程中最讓人麻煩的是中文字符處理,使用正則采集時(shí),中文字符加在正則內(nèi)雖然方便但容易出錯(cuò),正則中寫入中文必須保證被采集的字符集與當(dāng)前系統(tǒng)代碼字符集是相同的,否則匹配很容易失敗。

使用DOMDocument解析HTML內(nèi)容,也容易出現(xiàn)中文問題,一般是亂碼,其主要原因是HTML結(jié)構(gòu)不標(biāo)準(zhǔn),

出現(xiàn)亂碼都是字符集的問題,一般在HTML的head標(biāo)簽要指定字符集

<meta http-equiv=Content-Type content="text/html;charset=gb2312">

當(dāng)這個(gè)標(biāo)簽不存在時(shí),DOMDocument在解析時(shí)就會(huì)以默認(rèn)的方式去解析這個(gè)HTML內(nèi)容,導(dǎo)致中文編碼錯(cuò)誤。

所以在使用DOMDocument采集時(shí)不要直接使用

@$dom->loadHTMLFile($url);//加載對(duì)應(yīng)的URL地址HTML內(nèi)容

方式直接加載HTML,這樣只要所采集的HTML內(nèi)容沒有包含字符集的指定,整個(gè)HTML內(nèi)容解析后中文就不能用。

最好使用:

$ch = curl_init($url);//創(chuàng)建連接
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//輸出內(nèi)容
curl_setopt($ch, CURLOPT_TIMEOUT, 10);//設(shè)置超時(shí)時(shí)間
$html =  curl_exec($ch);//執(zhí)行連接,獲取內(nèi)容
if($err=curl_error($ch)){//判斷是否出錯(cuò)
   die($err);
}else{
    //判斷是否存在這個(gè)標(biāo)簽
   if(!stripos('"Content-Type"', $html)&&!stripos('content="text/html;', $html)){
       $meta='<head><meta http-equiv="Content-Type" content="text/html; charset=GBK" />';
       $html=str_replace('<head>', $meta, $html);
   }
}
curl_close($ch);
$dom = new DOMDocument('1.0','GBK');//創(chuàng)建DOM對(duì)象
@$dom->loadHTML($html);//加載對(duì)應(yīng)的URL地址HTML內(nèi)容
$xpath=new DOMXPath($dom);//創(chuàng)建DOMXPath對(duì)象

對(duì)應(yīng)所采集的頁面字符集,必須核對(duì)好。

DOMXPath有兩個(gè)函數(shù)用來操作內(nèi)部節(jié)點(diǎn):

query,和evaluate

query:取出給定的XPath表達(dá)式節(jié)點(diǎn)列表,只要表達(dá)式合法,返回DOMNodeList對(duì)象,否則返回false。

evaluate:取出給定XPath表達(dá)式節(jié)點(diǎn)列表,只要表達(dá)式合法并且有匹配的節(jié)點(diǎn)返回DOMNodeList對(duì)象,否則返回false。

兩個(gè)函數(shù)都是提取節(jié)點(diǎn),只是返回值上有些區(qū)別。

DOMNodeList 對(duì)象有一個(gè)函數(shù)和一個(gè)屬性:

/* 屬性,節(jié)點(diǎn)列表個(gè)數(shù) */
readonly publicint $length ;
/* 方法獲取第幾個(gè)節(jié)點(diǎn) */
DOMNode DOMNodelist::item ( int $index )

使用item函數(shù)獲取的節(jié)點(diǎn) DOMElement對(duì)象 ,

可以使用 getAttribute 獲取節(jié)點(diǎn)屬性值,也可以使用 nodeValue 屬性獲取節(jié)點(diǎn)內(nèi)容。

本文題目:PHP使用DOMDocument采集
文章分享:http://bm7419.com/article20/iposco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站收錄、網(wǎng)站內(nèi)鏈、定制網(wǎng)站、網(wǎng)站改版、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)