2012-06-21 126 views
-1

我那裏有<tr><td>元素像DOM文檔解析HTML

<tr> 
<td class="notextElementLabel width100">address:</td> 
<td style="width: 100%" colspan="1" class="formFieldelement"><b>12284,CA</b></td> 
</tr> 

讓數說上述<tr>在第四位置的一個HTML頁面意味着在此之前的元素還有3 <tr>

現在我想獲得地址 的價值,所以我做

$doc = new DOMDocument(); 
    @$doc->loadHTML($this->siteHtmlData); 
    $tdElements = $doc->getElementsByTagName("td"); 
    $i=0; 
    foreach ($tdElements as $node) { 
     if(trim($node->nodeValue) == 'address:'){ 
      echo "\n\ngot it\n\n"; 
     }else{ 
      echo "\n\n---no ---\n\n"; 
     } 

    } 

我怎樣才能得到「12284,CA」的價值。請指導。

感謝

+0

如果你有機會到HTML,你應該給你的目標的ID,使用它你可以很容易識別它。 –

+0

@Truth:看到它的客戶端頁面,所以不要告訴我如果它不在那裏使用ID,檢查下面的答案,我們在這裏給出正確的解決方案,而不是給無用的建議。 –

+0

@DineshGoyal:我們在這裏傳播知識。我們不*在這裏冒犯給我們提供完全合理建議的人,而且我們不*要求別人自由解決我們自己的問題。 – Jon

回答

0

你必須得到<tr>元素,然後解析它的孩子,類似於:

$trElements = $doc->getElementsByTagName("tr"); 
foreach ($trElements as $node) { 
    $children = $node->childNodes; 
    foreach($children as $child) 
     echo $child->textContent; // or $child->nodeValue 
} 

此輸出:address: 12284,CA

現在,如果有更多的<tr>元素是不是地址,您需要解析$children節點列表,以確保找到"address:",然後一旦您完成,就知道下一個孩子的價值是價值 您正在尋找。

1

在你的情況,你的查詢背後的邏輯非常簡單,它可以表示完全XPath語法:

//td[text()="address:"]/following-sibling::td/b/text() 

此發現具有相同文本到"address:"任何<td>節點,抓住以下<td> ,進入其中的<b>,並獲取它在那裏找到的文本。

這意味着你可以做

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 
echo $xpath->evaluate('string(//td[text()="address:"]/following-sibling::td/b)'); 

它會立即輸出結果,你所期待的。

+0

你可以寫出完整的代碼,任何爲什麼你的代碼之前有評論// td [text() –

+0

@DineshGoyal:這是因爲SO語法突出顯示器認爲它是一個評論。實際上它只是XPath語法。 – Jon

+0

+1 - 這種方法比我的更容易 – nickb

0

我得到了答案由我自己這類似於nickb的回答

$tdElements = $doc->getElementsByTagName("td"); 
    $tdCnt = $tdElements->length; 

    for ($idx = 0; $idx < $tdCnt; $idx++) { 

     if(trim($tdElements->item($idx)->nodeValue) == 'address:'){ 
      echo $tdElements->item($idx+1)->nodeValue; 
     } 
    } 

希望這將有助於