Я пытаюсь разобрать HTML из loadHTML, но у меня возникли проблемы, мне удалось пропустить все <tr>
s в документе, но я не знаю, как прокручивать <td>
s в каждой строке.
Это то, что я сделал до сих пор:
$DOM->loadHTML($url); $rows= $DOM->getElementsByTagName('tr'); for ($i = 0; $i < $rows->length; $i++) { // loop through rows // loop through columns ... }
Как я могу получить цикл через столбцы в каждой строке?
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"; }
Будет ли повторная петля работа?
$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 }
}
EDIT. Вам также нужно будет проверить parent node
чтобы убедиться, что родительские rows
– это tr
вы сейчас находитесь. Что-то вроде
if ($rows == tds->parent_node){ // do whatever }
Не может быть синтаксически 100% правильным, но концепция звучит.
Используйте 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; } }