PHP使用DOMDocument採集
採集是很多公司都做最的一件事,能夠快速的獲取別人辛苦得來的資料,雖為不道義,但無法禁止!
PHP採集一般方式有:
-
正則採集。
-
使用DOM物件採集。
-
使用字串函式提取。
這裡只說下DOM物件採集的一些問題:
PHP有DOM物件專門用來處理HTML或XML檔案,非常方便。
1
2
3
|
$dom = new DOMDocument( `1.0` , `GBK` ); //建立DOM物件
@ $dom ->loadHTMLFile( $url ); //載入對應的URL地址HTML內容
$xpath = new DOMXPath( $dom ); //建立DOMXPath物件
|
DOMXPath物件是一個支援 XPath 路徑表示式,http://www.w3school.com.cn/xpath/
XPath 路徑表示式類似 JQuery選擇器一樣,可以方便的找到對應的節點然後提取內容,當然 XPath 的選擇方式要遠比 JQuery 多。而且還支援很多種函式處理。
注意:
1
|
@ $dom ->loadHTMLFile( $url ); //載入對應的URL地址HTML內容
|
這句程式碼前面最好加上 @ 符號,因為在載入解析HTML內容時,或多或少會出現錯誤,如:在HTML頁面內一些 & 符號要轉義成 & ,html實體符號必須以 ;結束等等 才能順利解析。而這類要求在採集過程中是不可能的。
採集過程中最讓人麻煩的是中文字元處理,使用正則採集時,中文字元加在正則內雖然方便但容易出錯,正則中寫入中文必須保證被採集的字符集與當前系統程式碼字符集是相同的,否則匹配很容易失敗。
使用DOMDocument解析HTML內容,也容易出現中文問題,一般是亂碼,其主要原因是HTML結構不標準,
出現亂碼都是字符集的問題,一般在HTML的head標籤要指定字符集
<meta http-equiv=Content-Type content=”text/html;charset=gb2312″>
當這個標籤不存在時,DOMDocument在解析時就會以預設的方式去解析這個HTML內容,導致中文編碼錯誤。
所以在使用DOMDocument採集時不要直接使用
1
|
@ $dom ->loadHTMLFile( $url ); //載入對應的URL地址HTML內容
|
方式直接載入HTML,這樣只要所採集的HTML內容沒有包含字符集的指定,整個HTML內容解析後中文就不能用。
最好使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$ch = curl_init( $url ); //建立連線
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, TRUE); //輸出內容
curl_setopt( $ch , CURLOPT_TIMEOUT, 10); //設定超時時間
$html = curl_exec( $ch ); //執行連線,獲取內容
if ( $err =curl_error( $ch )){ //判斷是否出錯
die ( $err );
} else {
//判斷是否存在這個標籤
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` ); //建立DOM物件
@ $dom ->loadHTML( $html ); //載入對應的URL地址HTML內容
$xpath = new DOMXPath( $dom ); //建立DOMXPath物件
|
對應所採集的頁面字符集,必須核對好。
DOMXPath有兩個函式用來操作內部節點:
query,和evaluate
query:取出給定的XPath表示式節點列表,只要表示式合法,返回DOMNodeList物件,否則返回false。
evaluate:取出給定XPath表示式節點列表,只要表示式合法並且有匹配的節點返回DOMNodeList物件,否則返回false。
兩個函式都是提取節點,只是返回值上有些區別。
DOMNodeList 物件有一個函式和一個屬性:
/* 屬性,節點列表個數 */
readonly publicint $length ;
/* 方法獲取第幾個節點 */
DOMNode DOMNodelist::item ( int $index )
使用item函式獲取的節點 DOMElement 物件 ,
可以使用 getAttribute 獲取節點屬性值,也可以使用 nodeValue 屬性獲取節點內容。
本文轉自 ttlxihuan 51CTO部落格,原文連結:http://blog.51cto.com/php2012web/1619260
相關文章
- PHP使用QueryList採集微信文章頁PHP
- PHP採集商家資訊及採集方法概述(下)PHP
- PHP採集商家資訊及採集方法概述(上)薦PHP
- PHP - curl實現採集PHP
- php使用QueryList輕鬆採集JavaScript動態渲染頁面PHPJavaScript
- PHP 使用 QueryList 輕鬆採集 JavaScript 動態渲染頁面PHPJavaScript
- PHP 採集程式中日常的引數PHP
- PHP 資料採集的一種思路PHP
- php採集遠端文章簡單類PHP
- Ubuntu 20.04 安裝 php-xml 模組(報錯:Class 'DOMDocument' not found )UbuntuPHPXML
- 地圖資料採集,包括百度地圖採集,高德地圖採集,360地圖採集地圖
- PHP採集利器:根據開始字串和結束字串擷取需要的採集內容資料PHP字串
- 使用火蜘蛛採集器Firespider採集天貓商品資料並上傳到微店IDE
- PHP小說網站原始碼wap+pc自動採集PHP網站原始碼
- PHP 實現簡單的資料採集併入庫PHP
- API採集介面原始碼電商採集工具介面API原始碼
- WordPress自動採集釋出文章01-使用火車頭採集目標網站網站
- 畫江湖之 PHP 多程式開發 【多工採集圖片】PHP
- 畫江湖之 PHP 多程式開發 [多工採集圖片]PHP
- dede採集教程
- PHP Laravel passport 本地測試使用及採坑PHPLaravelPassport
- 自媒體素材採集平臺,採集影片文章素材
- scrapy-redis非多網址採集的使用Redis
- ffmpeg第8篇:使用ffprobe採集檔案資訊
- Scrapy爬蟲框架如何使用代理進行採集爬蟲框架
- 日誌採集/分析
- .NET 音訊採集音訊
- 自媒體素材採集平臺,素材採集方法都有這些
- 【京東】商品list列表採集+類目下的商品列表資料採集
- 1688阿里巴巴賣家電話採集軟體 阿里巴巴國際站採集 京東採集阿里
- Redis基於PHP簡單使用匯集RedisPHP
- 日誌服務之使用Nginx模式採集日誌Nginx模式
- 淘寶商家店鋪電話採集軟體使用教程
- 抖音小店商家電話採集軟體使用指南
- 淘寶商家電話採集,淘寶天貓商家號碼採集軟體
- 前端埋點資料採集(一)採集系統架構設計前端架構
- QueryList 4.0 簡潔、優雅、可擴充套件的PHP採集工具(爬蟲)套件PHP爬蟲
- 小輝-top採集.txt