[英]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.