4

HTML を loadHTML から解析しようとしていますが、問題が発生しています。ドキュメント内のすべての s をループすることはできましたが、各行の s<tr>をループする方法がわかりません。<td>

これは私がこれまで行ったことです:

$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 noderows親がtrあなたが現在いることを確認するためにチェックする必要があります。

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

構文的に100%正確ではないかもしれませんが、概念は健全です。

于 2013-01-09T21:11:22.943 に答える