2016-12-17 4 views
0

나는 file_get_contents으로 웹 사이트에서 html을 가져오고 있습니다. HTML 내부에 테이블 (클래스 이름 포함)이 있고 html 태그 안에 데이터를 가져 오려고합니다.file_get_contents에서 html의 DOM 요소 가져 오기

내가 URL에서 HTML 데이터를 가져 오는 방법이 있습니다 :

$url = 'http://example.com'; 
$content = file_get_contents($url); 

있는 HTML이 다음과 같습니다

<table class="space"> 
    <thead></thead> 
    <tbody> 
     <tr> 
     <td class="marsia">1</td> 
     <td class="mars"> 
      <div>Mars</div> 
     </td> 
     </tr> 
     <tr> 
     <td class="earthia">2</td> 
     <td class="earth"> 
      <div>Earth</div> 
     </td> 
     </tr> 
    </body> 
</table> 

우리가 jQuery를에서처럼 PHP에서 DOM 요소를 searh하는 방법이 있나요? 그래서 나는 값 1, 2 (첫 번째 td)와 두 번째 td의 div 값에 액세스 할 수 있습니다.

뭔가

같은

가) 각 그럴의 첫 TD의 가치 '와'두 번째 TD 내부 사업부의 가치를 '반환 TBODY 내부 해당 테이블 내부 클래스 이름 공간

B), 테이블의 HTML 검색

그래서 알겠습니다. 1, 화성, 2, 지구.

+0

[DOMDocument] (http://php.net/manual/en/class.domdocument.php)를 사용하여 HTML을 구문 분석하십시오. – Barmar

답변

0

예를 들어 DOM extension을 사용하십시오. 그 DOMXPath 클래스는 이러한 종류의 작업에 특히 유용합니다.

쉽게 이런 XPath 식으로 나열된 조건을 설정할 수

//table[@class="space"]//tr[count(td) = 2]/td 

-//table[@class="space"]"space" 문자열 동일 class 속성 값을 갖는 문서에서 모든 table 요소를 선택; - //tr[count(td) = 2]은 정확히 두 개의 td 자식 요소가있는 모든 tr 개의 요소를 선택합니다. - /tdtd 요소를 나타냅니다.

구현 샘플 :

$html = <<<'HTML' 
<table class="space"> 
    <thead></thead> 
    <tbody> 
     <tr> 
     <td class="marsia">1</td> 
     <td class="mars"> 
      <div>Mars</div> 
     </td> 
     </tr> 
     <tr> 
     <td class="earthia">2</td> 
     <td class="earth"> 
      <div>Earth</div> 
     </td> 
     </tr> 
     <tr> 
     <td class="earthia">3</td> 
     </tr> 
    </tbody> 
</table> 
HTML; 

$doc = new DOMDocument; 
$doc->loadHTML($html); 

$xpath = new DOMXPath($doc); 

$cells = $xpath->query('//table[@class="space"]//tr[count(td) = 2]/td'); 

$i = 0; 
foreach ($cells as $td) { 
    if (++$i % 2) { 
    $number = $td->nodeValue; 
    } else { 
    $planet = trim($td->textContent); 
    printf("%d: %s\n", $number, $planet); 
    } 
} 

출력

1: Mars 
2: Earth 

상술 그것으로, 같이 샘플보다는 실제 사용을 지시하는 것으로 간주 될 것으로 예상되는 코드 매우 확장 성이 없습니다. 논리는 XPath식이 각 행에 대해 정확히 두 개의 셀을 선택한다는 사실에 구속됩니다. 실제로, 당신이 행을 선택을 반복하고, 루프에 추가 조건을 넣어 할 수 있습니다, 예를 들면 :

$rows = $xpath->query('//table[@class="space"]//tr'); 

foreach ($rows as $tr) { 
    $cells = $xpath->query('.//td', $tr); 

    if ($cells->length < 2) { 
    continue; 
    } 

    $number = $cells[0]->nodeValue; 
    $planet = trim($cells[1]->textContent); 
    printf("%d: %s\n", $number, $planet); 
} 

DOMXPath::query()가 현재 행 ($tr)에 XPath 식 상대적인로 호출 한 후 검사 반환 된 DOMNodeList에 2 개 이상의 셀이 포함되어있는 경우 나머지 코드는 사소한 것입니다.


당신은 또한 또한 XPath를 지원 SimpleXML 확장을 사용할 수 있습니다. 그러나 확장자는 DOM 확장자에 비해 훨씬 유연하지 않습니다.

거대한 문서의 경우 XMLReader과 같은 SAX 기반 파서를 기반으로하는 확장 프로그램을 사용하십시오.