2012-07-15 18 views
6

我解析HTML,看起來像這樣:相關的XPath PHP

<table class="linesTbl"> 
     <tr class="linesHeader"> 
      <td><h3>EventName</h3></td> 
     </tr><tr class="linesColumns"> 
      <td>Date</td><td class="contestLine">Description</td> 
     </tr><tr class="linesAlt1"> 
      <td>Time</td><td>X1</td><td>Price1</td> 
     </tr><tr class="linesAlt1"> 
      <td>&nbsp;</td><td>X2</td><td>Price2</td></tr> 
</table> 

有多個表這樣的,所以我想通過他們循環,抓住所有的數據。我不確定xpath如何在php中處理查詢。目前我只是試圖從每個表中提取EventName。

$doc = new DOMDocument(); 
@$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 

foreach ($xpath->query("//table[@class = 'linesTbl']") as $tableNode){ 

    $headerTag = $xpath->query(".//h3", $tableNode); 
    echo $headerTag->nodeValue; 

} 

對於$ headerTag查詢我也試過query("./tr/td/h3", $tableNode)。我該如何去做這個相對查詢?

回答

9

你的XPath表達式是相不已:

$headerTag = $xpath->query(".//h3", $tableNode); 
          ^  ^^^^^^^^^^ 
          | relative-to node 
         relative path 

然而,這會返回一個節點列表,而不是一個單一的節點,因此,如果你這樣做:

echo $headerTag->item(0)->nodeValue; 
       ^^^^^^^^^ 

您可以訪問你想要的元素,看到輸出:

EventName 

我希望這是有幫助的。

+0

感謝。那解決了它 – sayhey69 2012-07-15 19:19:59

+0

可能是*位*遲到:什麼是**正確的**查詢,所以?你寫的代碼表明原始查詢不是正確的。 – superjos 2014-09-09 13:15:02

+0

是的,有點晚了,但最初的查詢很可能不是問題,而是從結果對象讀取結果數據。 'query()'返回一個[** DOMNodeList **](http://php.net/DOMNodeList),OP或多或少地期望它返回一個** DOMElement **。 – hakre 2014-09-11 06:46:57

0

其實,你的html不正確。

關於XPATH,你可以做到這一點的方式來專門定位到h3標籤: -

/table[@class='linesTbl']/tr[@class='linesHeader']/td/h3 
+0

如果我只需要EventName,這將工作,但我需要解析所有的數據,並保持與它來自的表相關的一切。 – sayhey69 2012-07-15 19:32:04