4

我正在尝试从 loadHTML 解析 HTML,但遇到了麻烦,我设法遍历<tr>了文档中的所有 s,但我不知道如何遍历<td>每行上的 s。

这是我到目前为止所做的:

$DOM->loadHTML($url);
$rows= $DOM->getElementsByTagName('tr');

for ($i = 0; $i < $rows->length; $i++) { // loop through rows
    // loop through columns
    ...
}

如何循环遍历每一行中的列?

4

3 回答 3

7

DOMElement还支持getElementsByTagName

$DOM = new DOMDocument();
$DOM->loadHTMLFile("file path or url");
$rows = $DOM->getElementsByTagName("tr");
for ($i = 0; $i < $rows->length; $i++) {
    $cols = $rows->item($i)->getElementsbyTagName("td");
    for ($j = 0; $j < $cols->length; $j++) {
        echo $cols->item($j)->nodeValue, "\t";
        // you can also use DOMElement::textContent
        // echo $cols->item($j)->textContent, "\t";
    }
    echo "\n";
}
于 2013-01-09T21:20:23.750 回答
1

用于DOMXPath通过相对 xpath 查询查询出子列节点,如下所示:

$xpath = new DOMXPath( $DOM);
$rows= $xpath->query('//table/tr');

foreach( $rows as $row) {
    $cols = $xpath->query( 'td', $row); // Get the <td> elements that are children of this <tr>
    foreach( $cols as $col) {
        echo $col->textContent;
    }
}

编辑:要从特定行开始并停止,请通过更改迭代的方式在行上保留自己的索引DOMNodeList

$xpath = new DOMXPath( $DOM);
$rows= $xpath->query('//table/tr');

for( $i = 3, $max = $rows->length - 2; $i < $max, $i++) {
    $row = $rows->item( $i);
    $cols = $xpath->query( 'td', $row);
    foreach( $cols as $col) {
        echo $col->textContent;
    }
}
于 2013-01-09T21:16:43.433 回答
0

重新循环会起作用吗?

$DOM->loadHTML($url);
$rows= $DOM->getElementsByTagName('tr');
$tds= $DOM->getElementsByTagName('td');

for ($i = 0; $i < $rows->length; $i++) {
// loop through columns
     for ($i = 0; $i < $tds->length; $i++) {
     // loop through rows

     }

}

编辑 您还必须检查parent node以确保rows父母是tr您目前所在的人。像

if ($rows == tds->parent_node){
// do whatever
}

在语法上可能不是 100% 正确,但这个概念是合理的。

于 2013-01-09T21:11:22.943 回答