2012-03-03 86 views
1

我在PHP中使用DOM解析HTML時遇到了問題。我想檢索href值,但給我錯誤。 我想要一個二維數組中的行值和href值。代碼中的最後一行也會給出錯誤。任何想法 ?我想要的輸出是 - 二維數組中的「
1」,「http:// .....」,用戶
2,「http:// .....」,服務器等。在PHP中解析HTML

<html> 
<body> 
    <table> 
     <tbody> 
      <tr> 
       <td>1 </td> 
       <td><a href="http://www.abcd.net"></a></td> 
       <td>User</td> 
      </tr> 
      <tr> 
       <td>2 </td> 
       <td><a href="http://www.def.net"></a></td> 
       <td>Server</td> 
      </tr> 
     </tbody> 
    </table> 
    </body> 
    </html> 

這裏是PHP代碼

$resArr = array(); 

$dom = new domDocument; 
@$dom -> loadHTML(file_get_contents($link)); 
$dom -> preserveWhiteSpace = false; 

$linkt = $dom -> getElementsByTagName('table'); 
$linkt1 = $linkt -> item(2); 

//tr 
foreach ($linkt1 -> childNodes as $key => $tag){ 
    //td 
    foreach ($tag -> childNodes as $key1 => $tag1){ 

     foreach ($tag1 -> childNodes as $key2 => $tag2){ 
      echo $tag2->hasattribute('href'); 
         //Error Occur here ----Fatal error: Call to 
         //undefined method DOMText::hasattribute() in on line 38 
     } 
    } 
} 

$resArr[$i][0] = $tag -> childNodes -> item(0) -> nodeValue; 
$resArr[$i][3] = $tag -> childNodes -> item(3) -> nodeValue; 
$resArr[$i][1] = $tag1 -> childNodes -> item(1) -> 
    childNodes -> item(0) -> getAttribute('href'); //the same error as above 
+8

如果您收到一個錯誤,*包括錯誤信息在你的問題*。 – Amber 2012-03-03 04:48:33

+3

您的預期輸出也會有幫助。我們無法讀懂你的想法。 – 2012-03-03 05:11:51

+0

你有控制HTML嗎?爲什麼不修正它,因此獲得更好的性能? – 2012-03-03 06:27:37

回答

3

我不知道你想要什麼輸出,但我敢肯定,這是一個XPath問題。像這樣?

// Your sample html is stored in $html as a string 
libxml_use_internal_errors(false); 
$dom = new DOMDocument(); 
$dom->loadHTML($html); 
libxml_use_internal_errors(true); 

$xp = new DOMXPath($dom); 

$rows = $xp->query('/html/body/table/tbody/tr'); 

$resArr = array(); 
foreach ($rows as $row) { 
    $resArr[] = array(
     $xp->evaluate('string(td[1])', $row), 
     $xp->evaluate('string(td[2]/a/@href)', $row), 
     $xp->evaluate('string(td[3])', $row), 
    ); 
} 

var_dump($resArr); 

從這個代碼的輸出:

array(2) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(2) "1 " 
    [1]=> 
    string(19) "http://www.abcd.net" 
    [2]=> 
    string(4) "User" 
    } 
    [1]=> 
    array(3) { 
    [0]=> 
    string(2) "2 " 
    [1]=> 
    string(18) "http://www.def.net" 
    [2]=> 
    string(6) "Server" 
    } 
} 
+0

適合我。查看更新的答案。你有什麼錯誤嗎? – 2012-03-03 08:02:49

+0

嗨弗朗西斯,感謝您的更新。有用! – zhtway 2012-03-03 19:47:50

+0

很好用。考慮接受答案,如果它回答你的問題。 – 2012-03-03 19:51:16