2012-05-21 61 views
1

我是PHP的相對初學者,我正在嘗試開發一個Web刮板腳本。該腳本旨在獲取VBulletin論壇頁面,然後解析頁面上的超鏈接以查找包含特定「id」元素的鏈接(即僅指向發佈在論壇上的消息線索的鏈接)。每個所需的鏈接都包含一個以「thread_title_ [Thread#here]」開頭的「id」元素。我提出了使用STRPOS作爲過濾器來檢查收集到的鏈接中的每個「id」元素並檢查它們是否包含片段「thread_title」的想法。不幸的是,我的努力似乎沒有結果。PHP與GetElementById,getAttribute和StrPos有關的問題

我將粘貼下面的代碼摘錄......以被標記爲完整noobie的風險。 ;)希望我不做一些非常愚蠢的事情。感謝您的幫助

$d = new domdocument(); 

    $d->loadHTMLfile("forum3.html"); 

    $links = $d->getElementsByTagName('a'); 
    echo '<html xmlns="http://www.w3.org/1999/xhtml" encoding="utf-8" lang="ar-sa">'; 

    foreach ($links as $link) 
    { 
     $threadTitleExists = $link->getAttribute('id'); 
     $pos = strpos($threadTitleExists, 'thread_title'); 
     $threadTitle = $link->nodeValue; 
     if ($link->hasAttribute('id') && ($pos==0)) 
     {  
      $threadTitle = trim(preg_replace('#/\s*\([^)]*\)/', ' ', $threadTitle)); 
      echo "Thread number: " . $threadTitleExists . "<br>Thread title: " . $threadTitle . "<p>"; 
     } 

     else 
     { 

      continue; 

     } 

    } 

回答

1

更改的行

if ($link->hasAttribute('id') && $pos != false) 

if ($link->hasAttribute('id') && $pos !== false) 

strpos()返回0,如果幹草堆用針,使用鬆散類型的比較時,其計算結果爲假開始運營商。手冊頁(鏈接)上有警告,請使用===運營商。

+0

謝謝,這有助於很多...但我仍然沒有通過nodeValue獲取超鏈接錨文本。它一直顯示空白。有任何想法嗎? – user1408397

+0

var_dump($ link-> nodeValue)產生了什麼?如果它不是空的,我會看看你正在申請的正則表達式'$ threadTitle' – Crisp

+0

是的......它絕對不是空的......我看到了錨文本的一些零碎。再次感謝 - 我要再看一眼,看看我能否理清問題。 – user1408397