2013-02-02 103 views
2

我試圖從html代碼中獲取圖像標籤。從html中提取圖像元素

$parser=new DOMDocument; 

    $parser->loadHTML($this->html); 
     foreach($parser->getElementsByTagName('img') as $imgNode){ 
     echo $parser->saveHTML($imgNode); 
     } 

$this->html含有大量的html代碼和Java腳本。

例如:

<div id='someid'> 
<button id='bt' onclick='clickme()'>click me</button> 
<img src='test.jpg'/> 
..... 
..... 
more... 

</div> 

<div> 
..... 
..... 
more... 

我得到了一個警告說

DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, 

我不知道如何解決這個問題,不知道是否有更好的方法來提取所有圖片來自大量的html代碼。

任何想法? 非常感謝!

回答

2

我絕不是這些問題的專家(但),但我希望這有助於某種方式。

根據this answer by troelskn可以使DOM解析器更耐使用libxml_use_internal_errors嚴重的HTML。這可能會幫助你擺脫那個錯誤。

解析文檔的所有圖像可以通過使用DOMXPath來完成。它需要DOMDocument作爲參數,並允許您在文檔上運行XPath查詢。

$document = new DOMDocument(); 
$document->loadHTML($your_html); 

// Suppress parse errors. 
libxml_use_internal_errors(false); 

$xpath = new DOMXPath($document) 

// Find all img tags. 
$img_nodes = $xpath->query('//img') 

DOMXPath::query返回DOMNodeList它可以通過使用DOMNodeList::item,它返回一個DOMNode成環。

for($i = 0; $i > $img_nodes->length; $i++) 
{ 
    $node = $img_nodes->item($i); 
    // Manipulate the node. 
} 

免責聲明:我發佈的代碼是未經測試,使用手動放在一起。

+0

「你可以通過使用libxml_use_internal_errors使DOM解析器更容忍格式錯誤的HTML」 - 錯誤!這簡單地使錯誤沉默。 'loadHTML()'已經可以容忍html錯誤,儘管以非標準的方式。 –

+0

@FrancisAvila提高某個問題的投訴門檻使得它更寬容,難道你不說? – thordarson

+0

說「更寬容」意味着不同的解析行爲,而不是不同的錯誤報告。此外,錯誤仍然會被收集(通過libxml),但不會立即發送到PHP的錯誤報告層,所以可以說它不是標準的「更寬容」。 –