2013-01-09 54 views
3

我試圖從loadHTML解析HTML,但我遇到了麻煩,我設法遍歷文檔中的所有<tr>,但我不知道如何循環遍歷每行的<td>使用PHP解析html並循環遍歷錶行和列?

這是我做過什麼,到目前爲止:

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

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

我怎樣才能通過每一行中的列得到循環?

+0

DOM方法周圍存在更易於使用的[wrappers](http://stackoverflow.com/questions/3577641/how-to-parse-and-process-html-xml-with-php),特別是用於循環元素集合。 – mario

回答

3

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

我一直無法回顯循環內的col內容。我試過'echo $ cols-> item($ i) - > nodeValue;',你可以編輯它嗎?我會採取這一個,如果它的工作,因爲它更容易實施我的情況 – lisovaccaro

+0

我已經對代碼進行了微小的更改。看看它是否有效。並看看列是否不是空的。 –

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%正確,但概念是健全的。

0

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

這個工程,我只是有一個問題,我怎麼能從第3行開始,以totalrows - 2結束?我在循環之前使用了'($ i = 3; $ i < $rows->長度-2; $ i ++)' – lisovaccaro

+0

@Liso - 您可以自己保留這些數據,我會更新我的答案 – nickb

+0

@Liso - 所有'$ xpath - > query()給你返回的是一個DOMNodeList,所以你可以迭代它,就像你以前一樣。現在的好處是,不是隻使用'getElementsByTagName()',而是更多地控制DOMNodeList實際放置的內容。嘗試我的更新解決方案,它應該符合您的要求。 – nickb