2009-02-14 91 views
4

我使用PHP和XPath爬進一個網站,我自己的(剛纔抓取的HTML不會到服務器),但我得到這個錯誤:PHP和XPath的問題

Catchable fatal error: Object of class DOMNodeList could not be converted to string in C:\wamp\www\crawler.php on line 46

我已經嘗試過呼應剛該行看到我得到什麼,但我只會得到相同的錯誤,我也試着用google搜索錯誤,但我最終結束了在PHP文檔,發現我的例子是完全一樣的PHP文檔中的除外我正在使用HTML而不是XML ......所以我不知道有什麼問題......這是我的代碼...

<?php 
$html = file_get_contents('http://miurl.com/mipagina#0'); 
// create document object model 
$dom = new DOMDocument(); 
// load html into document object model 
@$dom->loadHTML($html); 
// create domxpath instance 
$xPath = new DOMXPath($dom); 
// get all elements with a particular id and then loop through and print the href attribute 
$elements = $xPath->query("//*[@class='nombrecomplejo']"); 
if ($elements != null) { 
    foreach ($elements as $e) { 
     echo parse_str($e); 
    } 
}             
?> 

編輯

其實是抱歉,行是爲了測試時,我曾評論其他的東西...我刪除了它在這裏仍然有錯誤,但。

回答

9

根據documentation,「$elements != null」檢查是不必要的。 DOMXPath::query()將始終返回DOMNodeList,雖然它可能長度爲零,這不會混淆foreach循環。

另外,還要注意使用nodeValue屬性來獲取元素的文字表述:

$elements = $xPath->query("//*[@class='nombrecomplejo']"); 

foreach ($elements as $e) { 
    echo $e->nodeValue; 
} 

的理由讓你得到的錯誤是,你不能喂其他什麼比一個字符串parse_str(),你嘗試通過DOMElement

1

只是瘋狂的猜測,但echo $元素;是第46行,對嗎?我相信echo命令期望的東西是一個字符串或可轉換爲字符串,$元素不是。嘗試刪除該行。

1

這裏沒有具體的答案,只是調試提示。

首先,從

@$dom->loadHTML($html); 

刪除@這可能是因爲有你在這裏supressing的警告,可以幫助您調試問題。 loadHTML方法不能總是處理形成不良的HTML。在您發佈的例子中,我得到了以下

PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 109 in /Users/alanstorm/Desktop/foo.php on line 7 

如果你有這樣的能力,安裝tidy擴展,並用它來得到一個乾淨的文件。

此外,請確保$ html中實際上有一個字符串。由於您通過http請求頁面,可能是由於某種原因您的IP被阻止。

如果您不習慣處理完全的「硬核」面向對象接口,那麼DOMDocument類/對象的系列可能會非常棘手。

你需要記住的兩兩件事這裏

  1. 幾乎一切由一個DOMDocument方法返回是一個對象

  2. 大多數這些對象不能被轉換爲字符串

因此,當您嘗試將DOMNodeList轉換爲字符串時,它看起來像您的代碼錯誤whi ch意味着$ e是一個NodeList,而不是某個節點。

嘗試回顯$ e->的長度,而不是查看是否有一個特定長度的節點列表,或者遍歷$ e來找出裏面的內容。你也可以添加一個echo'。';到你的循環,然後對點進行計數,以確保你的Xpath查詢返回非零長度的東西。

我的猜測是你的xpath查詢在這裏返回一個空節點列表。下載Firefox xPath Checker和我們來運行您的HTML文檔上的xpath查詢。這會讓你確信你擁有正確的xPath,然後你可以專注於搞清楚PHP部分。當我使用你的示例頁面/代碼進行檢查時,我得到了一個空的結果。

祝你好運!