2014-09-01 158 views
2

我看到很多與SO有關的問題的答案,但或者存在細微的差別,我無法克服,或者我可能無法重複所示的過程。DOM結構,通過屬性名稱/值獲取元素

我試圖完成的是使用CURL從Google+商業頁面獲取HTML,迭代HTML和業務的每個評論都會刮掉評論HTML以在非Google +網頁上顯示該業務。

每個評審股這個父DIV結構:

<div class="ZWa nAa" guidedhelpid="userreviews"> ..... 

因此我試圖基於尋找和抓住與屬性的每個格div和innerHTML來做到foreach循環:guidehelpid =「userreviews」

我成功地通過CURL獲取HTML,並可以在定位標準TAG名稱(如「a」)時解析它,或者如果它具有ID,但在查找屬性名稱時使用PHP默認解析器遍歷HTML時存在問題:

如何在下面使用這個成功的代碼,並使其按照第二代碼中顯示的意圖工作,當然這是錯誤的?

工作代碼(發現,獲取,回聲的一切 「一」 在$輸出標籤)

$url = "https://plus.google.com/+Mcgowansac/about"; 
$curl = curl_init($url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
$output = curl_exec($curl); 
curl_close($curl); 
$DOM = new DOMDocument; 
@$DOM->loadHTML($output); 


foreach($DOM->getElementsByTagName('a') as $link) { 
     # Show the <a href> 
     echo $link->getAttribute('href'); 
     echo "<br />";} 

理論上所需的代碼:(查找自定義屬性每一個審查HTML和迴音它們)

$url = "https://plus.google.com/+Mcgowansac/about"; 
$curl = curl_init($url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
$output = curl_exec($curl); 
curl_close($curl); 
$DOM = new DOMDocument; 
@$DOM->loadHTML($output); 


foreach($DOM->getElementsByTagName('div[guidehelpid=userreviews]') as $review) { 
     echo $review; 
     echo "<br />"; } 

任何幫助我糾正這將不勝感激。如果沒有它,我不希望使用「simple_html_dom」。

+0

而不是你的getElementsByTagName(「DIV [guidehelpid = userreviews]」),你就不能堅持所有的div在一個大陣列並超過他們迭代(推出自己的解決方案嗎?) - 或者你可以使用其中一種XQUERY類型的類(這就是你僞代碼試圖做的對吧?) – splig 2014-09-01 21:51:20

+0

好吧,將頁面響應中的每個DIV粘貼到一個數組中,然後迭代數組看起來好像會大大增加腳本加載。也許我錯了,但似乎是非常低效。我會嘗試一下,看看它是如何工作的。 – DMSJax 2014-09-01 21:59:24

+0

是的你是對的它會增加大量的服務器CPU /服務器負載 - 我最近沒有看過,但如果有一個本地的(如編譯的C)XQUERY庫,這將是理想的,因爲它會很好,快速並且效率很高,而且您可以完成您正在嘗試執行的那種查詢 – splig 2014-09-01 22:01:07

回答

0

我建議你也可以在這種情況下使用DOMXpath。例如:

$url = "https://plus.google.com/+Mcgowansac/about"; 
$curl = curl_init($url); 
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
$output = curl_exec($curl); 
curl_close($curl); 

$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML($output); 
libxml_clear_errors(); 
$xpath = new DOMXpath($dom); 

$review = $xpath->query('//div[@guidedhelpid="userreviews"]'); 

if($review->length > 0) { // if it exists 
    echo $review->item(0)->nodeValue; 
    // echoes 
    // John DeRemer reviewed 3 months ago Last fall, we had a major issue with mold which required major ... and so on 
} 
+0

幽靈看起來很有希望,我完成了夜晚,但會在早上嘗試它。感謝您的建議和示例。 – DMSJax 2014-09-02 01:25:29

+0

@DMSJax確信男人沒有問題 – Ghost 2014-09-02 01:28:47

+0

再次感謝,我將接受答案,因爲它確實返回結果。但是,返回的數據是一個恐怖的工作,將其解析爲單獨的「評論」,並使其可用於CSS顯示,因爲沒有任何ID和CSS類不在父級別共享。猜猜我只是放棄這種特定的方法,嘗試新的東西。謝謝! – DMSJax 2014-09-02 14:14:43