2017-11-22 3 views
0

이것은 데이터를 긁어 내고 싶은 테이블입니다. PHP dom을 사용하여 긁을 수는 있지만 문제는 단지 Vacent-rows없이 날짜 만 가져오고 싶다는 것입니다. 나는 4 일에서 그러나 운 없음 시도했다.PHP를 사용하여 ID 및 클래스가없는 테이블 데이터를 긁어 내고 싶습니다.

<table cellspacing="1" width="700px"> 
    <colgroup><col width="100px"> 
    <col width="100px"> 
    <col width="30px"> 
    <col width="30px"> 
    <col width="60px"> 
    <col width="40px"> 
    <col width="45px"> 

</colgroup><tbody><tr bgcolor="#d6d6d6"> 
    <th>From</th> 
    <th>To</th> 
    <th>In</th> 
    <th>Out</th> 
    <th>Name</th> 
    <th>Adults</th> 
    <th>Children</th> 
    <th>Comment</th> 
</tr> 

<tr> 

    <td nowrap="" style="border-bottom: 1px solid #888888">Nov Thu 23, 2017</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">Nov Fri 24, 2017</td> 
    <td colspan="6" style="border-bottom: 1px solid #888888; color: #3333ff; text-align: center">-- Vacant --</td> 


</tr> 


<tr> 


    <td nowrap="" style="border-bottom: 1px solid #888888">Nov Fri 24, 2017</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">Nov Mon 27, 2017</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">15:00&nbsp;</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">10:00&nbsp;</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">WILLIAMS, KEELY</td> 
    <td style="border-bottom: 1px solid #888888">4&nbsp;</td> 
    <td style="border-bottom: 1px solid #888888">0&nbsp;</td> 
    <td style="border-bottom: 1px solid #888888">&nbsp;</td> 

</tr> 


<tr> 

    <td nowrap="" style="border-bottom: 1px solid #888888">Nov Mon 27, 2017</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">Dec Thu 07, 2017</td> 
    <td colspan="6" style="border-bottom: 1px solid #888888; color: #3333ff; text-align: center">-- Vacant --</td> 


</tr> 


<tr> 


    <td nowrap="" style="border-bottom: 1px solid #888888">Dec Thu 07, 2017</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">Dec Sun 10, 2017</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">15:00&nbsp;</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">10:00&nbsp;</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">HALL, TYLER</td> 
    <td style="border-bottom: 1px solid #888888">4&nbsp;</td> 
    <td style="border-bottom: 1px solid #888888">0&nbsp;</td> 
    <td style="border-bottom: 1px solid #888888">&nbsp;</td> 

</tr> 


<tr> 

    <td nowrap="" style="border-bottom: 1px solid #888888">Dec Sun 10, 2017</td> 
    <td nowrap="" style="border-bottom: 1px solid #888888">Dec Sat 16, 2017</td> 
    <td colspan="6" style="border-bottom: 1px solid #888888; color: #3333ff; text-align: center">-- Vacant --</td> 


</tr> 
</tbody></table> 

"보낸 사람"및 "받는 사람"필드 값만 가져 오려고합니다. "- 빈 -"날짜 그러나 여기에는 ID 또는 클래스는 그래서이 방법

$html = fetched HTML here; 

$pokemon_doc = new DOMDocument(); 

libxml_use_internal_errors(TRUE); //disable libxml errors 

if(!empty($html)){ //if any html is actually returned 

    $pokemon_doc->loadHTML($html); 
    libxml_clear_errors(); //remove errors for yucky html 

    $pokemon_xpath = new DOMXPath($pokemon_doc); 

    //get all the h2's with an id 
    $pokemon_row = $pokemon_xpath->query('//table//td[@style="border-bottom: 1px solid #888888"]'); 

    if($pokemon_row->length > 0){ 

     $oe = 1; 
     foreach($pokemon_row as $row){ 
      if ($oe % 2 == 0) { 
       //mysqli_query($con,"INSERT INTO booking VALUES('','','".(validateDate($row->nodeValue) ? $row->nodeValue : '')."')"); 
       echo (validateDate($row->nodeValue) && $row->nodeValue!='-- Vacant --' ? $row->nodeValue : '') . " | <br>"; 
      } else { 
       //mysqli_query($con,"INSERT INTO booking VALUES('','".(validateDate($row->nodeValue) ? $row->nodeValue : '')."','')"); 
       echo (validateDate($row->nodeValue) && $row->nodeValue!='-- Vacant --' ? $row->nodeValue : '') . " , <br>"; 
      } 

      $oe++; 
     } 
    } 
} else { 
    echo 'no html returend.'; 
} 


// Check date validate function 
function validateDate($date) 
{ 
    $d = DateTime::createFromFormat('M D d, Y', $date); 
    return $d && $d->format('M D d, Y') == $date; 
} 

문제는 내가 필요하지 않습니다이다 사용하지 않습니다. 이 코드를 사용해 보았지만 행운은 없습니다.

누구든지 나를 도와주세요. 감사합니다. .

+0

, 그것은 XPATH – ArtisticPhoenix

답변

1

이를 단축하고 CLI에서이를 사용하도록 다시 썼다, 그러나 그 XPath 쿼리가 나를 위해 일한 :

$pokemon_row = $pokemon_xpath->query('//table//tr[not(contains(., \'-- Vacant --\'))]'); 

if($pokemon_row->length > 0) { 
    $oe = 1; 
    foreach($pokemon_row as $row) { 
     $nodeList = $pokemon_xpath->query('td', $row); 

     $fromNode = $nodeList->item(0); 
     $toNode = $nodeList->item(1); 

     echo 'From :'.(validateDate($fromNode->nodeValue) ? $fromNode->nodeValue : '') . PHP_EOL; 
     echo 'To :'. (validateDate($toNode->nodeValue) ? $toNode->nodeValue : '') . PHP_EOL; 

     $oe++; 
    } 
} 
내가 PHPQuery을 사용하는 것이 좋습니다 것
+0

덕분에, 사람이 다음 훨씬 낫다. 효과가 있습니다. \ 'Vacant - \'@Benjamin –

+0

그 쿼리는 "- Vacant -"문자열을 포함하지 않는 행만을 찾고 있습니다. 그 행을 가지면 스크립트는 첫 번째 (0) 및 두 번째 (1) 번째 요소 만 가져 와서 찾고 있던 날짜를 가져옵니다. –

+0

예. 감사합니다. @ 벤자민 –