2014-11-23 40 views
0

我不知道我做錯了什麼。每次它通過它只是保持循環,並拉動在同一行中列出的所有城市,並將它們與狀態,然後當它進入下一個狀態,它開始在正確的地方,但仍然繼續。我已經嘗試了4個小時,但我無法弄清楚。PHP - 無限循環的問題

$url = 'http://www.craigslist.org/about/sites'; 
$output = file_get_contents($url); 
$doc = new DOMDocument(); 

libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue 
$doc->loadHTML($output); 
libxml_use_internal_errors(false); //Start Showing Errors 

$xpath = new DOMXpath($doc);  

foreach ($xpath->query('//h1') as $e) { 
    $country = $e->nodeValue; 
    $list = array(); 
    foreach ($xpath->query('./following-sibling::div[@class="colmask"]', $e) as $li) { 

     foreach ($xpath->query('//div/h4', $e) as $div) { 
      $state = $div->nodeValue; 


      foreach ($xpath->query('./following-sibling::ul/li', $div) as $div2) {      

       $href = $div2->getAttribute("href"); 
       $text = trim(preg_replace("/[\r\n]+/", " ", $div2->nodeValue)); 
       echo 'Country: ' . $country . ' State: ' . $state . ' CITY: text['. $text . '] href[' . $href . '] <br/><br/><br/>'; 


      } 


     } 

    } 
} 
+1

4嵌套'foreach' loops..wohoo .. – 2014-11-23 08:17:53

+0

我沒有不知道該怎麼做......這些元素都在彼此之外,我需要在城市的循環頂部抓取兩個不同的「標題」。 – eqiz 2014-11-23 08:19:02

+0

您是否嘗試過有限的樣本數據以查看樣本集是否出現無限循環?例如,有一組美國,阿拉巴馬州和城市,只是看看結果如何? – Adib 2014-11-23 08:21:14

回答

0

當初有人叫DuffyDake回答我的問題。下面是答案..

foreach ($xpath->query('./following-sibling::ul[1]/li', $div) as $div2) {      

       $href = $div2->getAttribute("href"); 
       $text = trim(preg_replace("/[\r\n]+/", " ", $div2->nodeValue)); 
       echo 'Country: ' . $country . ' State: ' . $state . ' CITY: text['. $text . '] href[' . $href . '] <br/><br/><br/>'; 


      } 

缺少的部分是[1]〜參照第一UL發現,沒有什麼過去那種

1

您應該儘可能避免嵌套query調用。相反,使用item方法在每次迭代中獲取DOMNodeList。

例如,而不是書寫:

foreach ($xpath->query('./following-sibling::div[@class="colmask"]', $e) as $li) { 
    foreach ($xpath->query('//div/h4', $e) as $div) { 
     $state = $div->nodeValue; 

寫:

$result = $xpath->query('./following-sibling::div[@class="colmask"]', $e); 
$state = $result->item(0)->nodeValue; 

如果您需要的DOMNode $state導航,使用$state->parentNode$state->nextSibling,和/或$state->previousSibling

+0

我這樣做了,它仍然正確顯示$狀態名稱,但是如何將城市拉出下一個節點? – eqiz 2014-11-23 08:54:16

+0

我更新了我的答案 – 2014-11-23 09:00:30

+0

我嘗試過尋找一段時間,但是如何返回,或者經歷nextSibling的結果? – eqiz 2014-11-23 09:26:39