Нужна помощь с таблицей разбора PHP DOM XPath - PullRequest
0 голосов
/ 26 февраля 2009

Я только недавно прочитал о модуле DOM в PHP, и теперь я пытаюсь использовать его для анализа HTML-документа. На странице говорилось, что это было гораздо лучшее решение, чем использование preg, но мне трудно понять, как его использовать.

Страница содержит таблицу с датами и X числом событий для даты.

Сначала мне нужно получить текст (дату) из tr с valign = "bottom", а затем мне нужно получить все значения столбцов из всех tr с valign = "top", который находится ниже этого tr. Мне нужны все значения столбцов от каждого tr ниже tr с датой до следующего tr с valign = "bottom" (следующая дата). Число 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>

До сих пор я был в состоянии получить первые два свидания (меня интересуют только первые два), но я не знаю, как идти отсюда.

Запрос xpath, который я использую для получения даты trs,

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

Теперь мне нужен способ связать все события этого дня с датой, т.е. выберите все tds и все значения столбца до следующей даты tr.

Ответы [ 3 ]

3 голосов
/ 26 июля 2009
$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 ); 
0 голосов
/ 16 сентября 2010

Это выражение 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']
0 голосов
/ 26 февраля 2009

Использование following-sibling().

...