2013-05-17 65 views
0

我有9個錶行,但只有三個得到返回時,我查詢頂級節點與DOMXpath。PHP的DOMXpath無法返回一組完整的子節點

<table class="something"> 
    <tbody> 
     <tr> 
      <td class="label">One</td> 
      <td>111111</td> 
     </tr> 
     <tr> 
      <td class="label">Two</td> 
      <td>1454</td> 
     </tr>  
     <tr> 
      <td class="label">Three</td> 
      <td></td> 
     </tr> 
     <tr> 
      <td class="label">Four</td> 
      <td>0</td> 
     </tr> 
     <tr> 
      <td class="label">Five</td> 
      <td>45</td> 
     </tr> 
     <tr> 
      <td class="label">Six</td> 
      <td>45</td> 
     </tr> 
     <tr> 
      <td class="label">Seven</td> 
      <td>5</td> 
     </tr> 
     <tr> 
      <td class="label">Eight</td> 
      <td>0</td> 
     </tr> 
     <tr> 
      <td class="label">Nine</td> 
      <td>0</td> 
     </tr> 
    </tbody> 
</table> 

我使用DOMDocument來加載HTML。

$doc = new DOMDocument; 
@$doc->loadHTML($htmlData); 
$xpath = new DOMXpath($doc); 
$tableRows = $xpath->query('//table[@class="something"]//tr'); 

不幸的是,一整套錶行不會被返回 - 只有前三個。我猜想空元素<td></td>以某種方式拋棄了xpath解析器。有針對這個的解決方法嗎?

編輯:

我嘗試另一種方法,而無需使用DOMXpath。

$request = drupal_http_request($url); 

    $data = $request->data; 

    $doc = new DOMDocument; 
    @$doc->loadHTML($data); 
    $tables = $doc->getElementsByTagName('table'); 
    $rows = $tables->item(2)->getElementsByTagName('tr'); 
    $output = ''; 
    foreach($rows as $row) { 
     $cols = $row->getElementsByTagName('td'); 
     foreach($cols as $col){ 
      $output .= $col->nodeValue . '<br/>'; 
     } 
    } 
    return $output; 

兩者接近輸出這個HTML:

<div class="content"> 
    One<br>111111<br>Two<br>1454<br>Three<br><br> 
</div> 

在第一示例$ tableRows->長度爲3,其與所述輸出但不具有9行的標記相一致。

+0

不知道這是否是一個抄寫錯誤或代碼錯字,但上面的表類是somethiing而不是某些東西。其次,我得到8/tr結果與該查詢就好了? – pp19dd

+0

您的XPath完全正常。之後會有什麼PHP代碼?問題可能在那裏。 –

+0

這可能是我颳了一個壞標記的網頁,正在拋出DOMDocument –

回答

0

我在刮一個有無效,損壞,髒HTML的網頁。 DOMDocument喜歡乾淨整潔(我猜)。相反,我使用simple_html_dom.php腳本來解析HTML,它工作正常。