首頁 >後端開發 >php教程 >php解析html類別庫simple_html_dom

php解析html類別庫simple_html_dom

WBOY
WBOY原創
2016-08-08 09:28:501354瀏覽

下載網址:https://github.com/samacs/simple_html_dom
解析器不只是幫助我們驗證html文檔;更能解析不符合W3C標準的html文檔。它使用了類似jQuery的元素選擇器,透過元素的id,class,tag等等來查找定位;同時也提供新增、刪除、修改文件樹的功能。當然,這樣一款強大的html Dom解析器也不是盡善盡美;在使用的過程中需要十分小心記憶體消耗的情況。不過,別擔心;本文中,筆者在最後會為各位介紹如何避免消耗過多的記憶體。
開始使用
上傳類別檔案以後,有三種方式呼叫這個類別:
從url載入html文檔
從字串中載入html文檔
從檔案載入html文檔













程式碼如下:
// 新建一個Dom實例

$html = new simple_html_dom();// 從url載入$html->load_file('http://www.jb51.net ');// 從字串載入$html->load('

從字串載入html文件示範');//從檔案中載入

$html->load_file('path/file/test.html');
?>



如果從字串載入html文檔,需要先從網路上下載。建議使用cURL來抓取html文檔並載入DOM。

查找html元素

可以使用find函數來找出html文檔中的元素。傳回的結果是一個包含了物件的陣列。我們使用HTML DOM解析類別中的函數來存取這些對象,以下給出幾個範例:


.
程式碼如下:

//htmlhtml文件中的超連結元素查找//htmlhtml文件中的超連結元素查找

$a = $html->find('a');

//查找文檔中第(N)個超鏈接,如果沒有找到則返回空數組.
$a = $html->find('a', 0);
// 找id為main的div元素
$main = $html->find('div[id=main]',0);
// 找出所有包含有id屬性的div元素
$divs = $html->find('div[id]');
// 找出所有包含有id屬性的元素
$divs = $html->find('[id]');
?>

也可以使用類似jQuery的選擇器來找出定位元素:

.程式碼如下:

// 找到id='#container'的元素

// id='#container'的元素
> find('#container');
// 找到所有class=foo的元素
$ret = $html->find('.foo');// 尋找多個html標籤

$ret = $html-> find('a, img');
// 還可以這樣用$ret = $html->find('a[title], img[title]');?>

解析器支援對子元素的查找


.

程式碼如下:


// 找出ul列表中所有的li項
$ret = $html->find('ul li'); /找出ul 清單指定class=selected的li項
$ret = $html->find('ul li.selected');
?>



如果你覺得這樣用起來麻煩,使用內建函數可以輕鬆定位元素的父元素、子元素與相鄰元素


.
程式碼如下:
// 傳回父元素
$e->parent; e->children;// 透過索引號傳回指定子元素$e->children(0);
// 傳回第一個資源速$e->first_child ();// 傳回最後一個子元素
$e->last _child ();// 返回上一個相鄰元素$e->prev_sibling ();
//返回下一個相鄰元素$e->next_sibling ();?>
元素屬性操作
使用簡單的正規表示式來操作屬性選擇器。
[attribute] – 選取包含某屬性的html元素

[attribute=value] – 選取所有指定值屬性的html元素[attribute!=value]-html 選取所有非指定值屬性的元素元素

[attribute^=value] -選擇所有指定值開頭屬性的html元素


[attribute$=value] 選擇所有指定值結尾屬性的html元素

[attribute*=value指定值屬性的html元素
在解析器中呼叫元素屬性

在DOM中元素屬性也是物件:

.

?

🎜🎜.🎜🎜?將$a的錨連結值賦給$link變數🎜$link = $a->href;🎜?>🎜🎜🎜🎜或:🎜🎜🎜🎜🎜.🎜 link = $html->find('a',0)->href;🎜?🎜


每個物件都有4個基本物件屬性:
tag – 傳回html標籤名稱
innertext – 傳回innerHTML
outertext – 傳回outerHTMLs + outerHTMLs_ 在解析器中編輯元素
編輯元素屬性的用法和調用它們是類似的:

.

代碼如下:

$a->href = 'http://www.jb51.net';// 刪除錨連結

$a->href = null;

// 偵測是否有錨連結
if(isset($a ->href)) {
//程式碼
}
?>



解析器中沒有專門的方法來新增、刪除元素,不過可以變通一下使用:

:.
// 封裝元素

$e->outertext = '
' . $e->outertext . '
';

// 刪除元素$e->outertext = ''; // 新增元素$e->outertext = $e->outertext . '

foo
';// 插入元素$e->outertext = '
foo
' . $e->outertext;

?



保存修改後的html DOM文件也很簡單:




.

代碼輸出

echo $doc;
?>

如何避免解析器消耗過多記憶體在本文的開頭中,筆者就提到了Simple HTML DOM解析器消耗記憶體過多的問題。如果php腳本佔用記憶體太多,會導致網站停止回應等一系列嚴重的問題。解決的方法也很簡單,在解析器載入html文件並使用完成後,記得清理掉這個物件就可以了。當然,也不要把問題看得太嚴重了。如果只是載入了2、3個文檔,清理或不清理是沒有多大區別的。當你載入了5個10個甚至更多的文件的時候,用完一個就清理一下記憶體絕對是對自己負責啦^_^



.

程式碼如下:

程式碼如下:

程式碼如下:

程式碼如下:



$html->clear();

?>

以上就介紹了php解析html類別庫simple_html_dom,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

🎜

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn