簡體   English   中英

需要有關PHP DOM XPath解析表的幫助

[英]Need help with PHP DOM XPath parsing table

我最近剛剛閱讀了有關PHP中的DOM模塊的信息,現在我正試圖將其用於解析HTML文檔。 該頁面說,這是比使用preg更好的解決方案,但是我很難弄清楚如何使用它。

該頁面包含一個表,該表包含日期和該日期的X個事件。

首先,我需要使用valign =“ bottom”從tr中獲取文本(日期),然后我需要使用低於該tr的valign =“ top”從所有tr中獲取所有列值。 我需要從tr下方的每個tr到日期的所有列值,直到具有valign =“ bottom”(下一個日期)的下一個tr。 帶有列數據的tr的數目是未知的,可以為零或很多。

這是頁面上的HTML外觀:

 <table> <tr valign="bottom"> <td colspan="4">2009-02-26</td> </tr> <tr valign="top"> <td>21:00</td> <td>Column data</td> <td>Column data</td> <td>Column data</td> </tr> <tr valign="top"> <td>23:00</td> <td>Column data</td> <td>Column data</td> <td>Column data</td> </tr> <tr valign="bottom"> <td colspan="4">2009-02-27</td> </tr> <tr valign="top"> <td>06:00</td> <td>Column data</td> <td>Column data</td> <td>Column data</td> </tr> <tr valign="top"> <td>10:00</td> <td>Column data</td> <td>Column data</td> <td>Column data</td> </tr> <tr valign="top"> <td>13:00</td> <td>Column data</td> <td>Column data</td> <td>Column data</td> </tr> </table> 

到目前為止,我已經能夠獲得前兩個日期(我只對前兩個日期感興趣),但是我不知道如何從這里開始。

我用來獲取日期trs的xpath查詢是

$result = $xpath->query('//tr[@valign="bottom"][position()<3]);

現在,我需要一種方法將當天的所有事件與日期關聯起來。 選擇直到下一個日期tr的所有tds和所有列值。

$oldSetting = libxml_use_internal_errors( true ); 
libxml_clear_errors(); 

$html = new DOMDocument(); 
$html->loadHtmlFile('http://url/table.html'); 

$xpath = new DOMXPath( $html ); 
$elements = $xpath->query( "//table/tr" ); 

foreach ( $elements as $item ) {
  $newDom = new DOMDocument;
  $newDom->appendChild($newDom->importNode($item,true));

  $xpath = new DOMXPath( $newDom ); 

  foreach ($item->attributes as $attribute) { 

    for ($node = $item->firstChild; $node !== NULL; 
         $node = $node->nextSibling) {
      if (($attribute->nodeName =='valign') && ($attribute->nodeValue=='top'))
      {
        print($node->nodeValue); 
      }
      else
      {
        print("<br>".$node->nodeValue);
      }
    }
    print("<br>");
  } 
}

libxml_clear_errors(); 
libxml_use_internal_errors( $oldSetting ); 

這個XPath表達式

/table/tr/td[@colspan=4]

要么

/table/tr[valign='bottom']/td

結果是一個帶有日期單元格的節點集。

如何獲得標記之間的細胞?

/table/tr/td[not(@colspan=4)][preceding::td[@colspan=4][1]='2009-02-26']

使用following-sibling()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM