2012-03-03 6 views
1

PHP에서 DOM을 사용하여 HTML을 구문 분석하는 데 문제가 있습니다. href 값을 검색하고 싶지만 오류가 발생합니다. 2 차원 배열에서 행 값과 href 값을 함께 원합니다. 코드의 마지막 줄 또한 오류를줍니다. 어떤 아이디어? 원하는 출력은 -
1, "http : // .....", 사용자
2, "http : // .....", 서버 ... 등이 2D 배열에 있습니다.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

+3

예상 출력도 도움이 될 것입니다. 우리는 당신의 마음을 읽을 수 없습니다. –

+0

HTML을 제어 할 수 있습니까? 왜 그것을 souce에서 고쳐서 더 나은 성능을 얻을 수 있습니까? –

답변

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

나를 위해 잘 작동합니다. 업데이트 된 답변보기 오류가 있습니까? –

+0

안녕하세요, Francis, 업데이트 주셔서 감사합니다. 그것은 작동합니다! – zhtway

+0

다행입니다. 질문에 대한 답변을 수락하는 것을 고려하십시오. –