【问题标题】:Parse html using PHP and loop through table rows and columns?使用 PHP 解析 html 并循环遍历表的行和列?
【发布时间】:2012-12-24 03:58:27
【问题描述】:

我正在尝试从 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
    ...
}

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

【问题讨论】:

  • 更易于使用的wrappers 围绕 DOM 方法存在,专门用于循环元素集合。

标签: php html-parsing domdocument


【解决方案1】:

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";
}

【讨论】:

  • 我无法在循环中回显 col 内容。我试过echo $cols-&gt;item($i)-&gt;nodeValue;,你能编辑一下吗?如果它有效,我会选择它,因为它更容易在我的情况下实现
  • 我对代码做了一些小的改动。看看它是否有效。并查看该列是否为空。
【解决方案2】:

使用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;
    }
}

【讨论】:

  • 这行得通,我只是有一个问题,我怎样才能从第 3 行开始并以 totalrows - 2 结束?我之前在循环中使用($i = 3; $i &lt; $rows-&gt;length -2; $i++)
  • @Liso - 你可以自己保留这些数字,我会更新我的答案
  • @Liso - 所有$xpath-&gt;query() 给你的是一个DOMNodeList,所以你可以像以前一样迭代它。好处是,现在,您不仅可以使用getElementsByTagName(),还可以更好地控制实际放入该DOMNodeList 中的内容。试试我更新的解决方案,它应该可以满足您的要求。
【解决方案3】:

重新循环会起作用吗?

$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-02-04
    • 2015-09-21
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多