2012-07-21 2 views
1

domDocument를 사용하고 있습니다. 나는 가까이 있지만 마지막 조금을위한 도움이 필요합니다domDocument를 사용하여 src 요소 가져 오기

나는이 HTML을 아래에 단지 가지고있다. 행이 여러 개 있습니다. 나는 href를 얻으려고 노력하고있다.

지금까지 다음을 수행하고 있습니다. 테이블, tr 및 td를 얻을 수 있지만 거기에서 무엇을해야할지 확신하지 못합니다. 어떤 도움

감사

foreach ($dom->getElementsByTagName('table') as $tableitem) { 
    if ($tableitem->getAttribute('class') == 'tableStyle02'){ 
     $rows = $tableitem->getElementsByTagName('tr'); 
     foreach ($rows as $row){ 
      $cols = $row->getElementsByTagName('td'); 

      $hrefs = $cols->item(0)->getElementsByTagName('a'); 
     }  
    } 
} 

HTML 코드 :

<table width="100%" border="0" cellspacing="0" cellpadding="2" class="tableStyle02"> 
    <tr> 
     <td><span class="Name"><a href="bin.php?cid=703&size=0"> 
       <strong>Conference Facility</strong></a></span></td> 
     <td align="center" nowrap>0.00</td> 
     <td align="center">&nbsp;0&nbsp;</td> 
     <td align="center">&nbsp;&nbsp;</td> 
     <td align="center">&nbsp;0&nbsp;</td> 
     <td align="center">&nbsp;0&nbsp;</td> 
     <td align="center">&nbsp;0 - 0 &nbsp;</td> 
     <td align="center">&nbsp;Wired Internet,&nbsp;&nbsp;&nbsp;</td> 
     <td align="center">&nbsp;&nbsp;</td> 
    </tr> 

답변

3

은 내가 당신에게 XPath는의 개념, DomDocuments에 대한 쿼리 언어를 소개하자 :는 A 내에서 클래스 속성 tableStyle02와 테이블 태그 다음 href 속성을 가지고 :

//table[@class="tableStyle02"]//a/@href 

는 다음과 같이 읽습니다 자식 태그.

아니면 tr의 foreach는 있었다뿐만 아니라 td 요소로 : 그 길에서 지금

//table[@class="tableStyle02"]/tr/td/a/@href 

의 태그는 TR 태그의 직접적인 아이 인 TD 태그의 직접적인 아이입니다 테이블 태그의 직접 자식입니다. 보시다시피, xpath를 사용하면 PHP 코드의 모든 것을 작성하는 것보다 요소 경로를 공식화하는 것이 훨씬 쉽습니다. bin.php?cid=703&size=0 :

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xp = new DOMXPath($doc); 
$href = $xp->evaluate('string(//table[@class="tableStyle02"]//a/@href)'); 

변수 $href 다음 문자열을 포함처럼

적당히 PHP 코드 PHP이 볼 수있다.


이 예에서는 그렇게 ->evaluate 처음 발견 속성 노드로부터 생성되는 문자열을 리턴하는 문자열 (string(...))로한다.대신 당신이뿐만 아니라 노드 목록을 반환 할 수 있습니다

$hrefs = $xp->query('//table[@class="tableStyle02"]/tr/td/span/a/@href'); 
#    ^^^^^          ^^^^ 

을 지금 $hrefs 평소 DOMNodeList이 포함되어, 여기에 모든 href 속성 노드가 포함

echo $hrefs->item(0)->nodeValue; # bin.php?cid=703&size=0 

는주의를 당신은에 하나의 슬래시 /를 사용하는 경우 별도의 태그를 사용하여 직접적인 자녀가 될 필요가 있습니다. 두 개의 슬래시 //은 하위 항목 (하위 항목 (하위 항목 (of ...)))이 될 수 있습니다.

+0

위대하고 새로운 기능입니다. 그래서 나는 조금 놀았고 또 하나의 질문이 있습니다. 내 테이블에 여러 href가있는 많은 행이 있습니다. $ href = $ xp-> evaluate ('string (// table [@ class = "tableStyle02"]/tr/td/a/@ href)'); 그러나 단지 첫번째를 얻었다. 나는 어떻게해야합니까? – randy

+0

확실히, 그 변형에 대한 답을 편집했습니다. 이전에했던 것처럼 $ hrefs를 foreach 할 수도 있습니다. 그래서 두 방법 모두 잘 작동합니다. – hakre

1

당신은 개별 DOMElement 인스턴스에 getAttribute()을 사용할 수 있어야합니다, (당신은 그것을 예제의 두 번째 줄을 사용하는 것처럼) :

foreach ($hrefs as $a_node) { 
    if ($a_node->hasAttribute('href')) { 
     print $a_node->getAttribute('href'); 
    } 
} 
1

내림차순으로 탐색 할 필요가 없습니다. 이 시점에서

foreach ($dom->getElementsByTagName('table') as $tableitem) { 
    if ($tableitem->getAttribute('class') == 'tableStyle02'){ 
     $links = $tableitem->getElementsByTagName("a"); 
    } 
} 

$links 지금 DOMNodeList, 그래서 당신은 그것을 반복 할 수 있습니다 : DOM 계층 구조 getElementsByTagName를 사용하는

foreach ($dom->getElementsByTagName('table') as $tableitem) { 
    if ($tableitem->getAttribute('class') == 'tableStyle02'){ 
     $links = $tableitem->getElementsByTagName("a"); 
     $hrefs = array(); 
     foreach ($links as $link) { 
      $hrefs[] = $link->getAttribute("href"); 
     } 
    } 
} 
// Do things with $hrefs