2013-02-28 65 views
3

我們已經有了一個帶有靜態信息的古老(內部)網站。我們將用更好的東西替換它,因此我需要獲取所有信息。我使用通過正則表達式做到這一點,但最近我偶然發現一些文章指出,使用正則表達式來解析來自HTML的信息是inviting cthulhu to this realm解析HTML DOM方式

因此,我決定學習一些新的技巧,重新開始,並做到DOM方式。 的HTML一部分,我需要看起來像這樣:

<table id="articles"> 
    <tr> 
    <th> 
     <a href='articles/aa123.html'><img src="/iamges/aa123.jpg" alt="some article"></a> 
     <br />short description 
    </th> 
    <td> 
     <table class='details'> 
     <tr><th><a href='articles/aa123.html'>Some Article</a></th></tr> 
     <tr><th>Type:</th><td>article type</td></tr> 
     <tr><th>Price:</th><td>€ 99</td></tr> 
     <tr><th>Manufacturer:</th><td>Some Company</td></tr> 
     <tr><th>Warehouse:</th><td>x</td></tr> 
     </table> 
    </td> 
</tr> 
</table> 

到目前爲止,我得到這個:

$dom = new DOMDocument(); 
@$dom->loadHTMLFile ($file); 
$xpath = new DOMXPath($dom); 
$query = "/html/body/table[@id='articles']//th"; //catch all TH's 
$data = $xpath->evaluate($query); 

這是關於我卡住。我知道返回的TH的所有內容都在ChildNodes中,但我很難獲取這些值。我需要詳細信息頁面的URL和Price列的值。

我如何獲取這些提取?

目前,我想出了以下內容:

$query = '//table[@class="details"]//td'; 
$data= $xpath->evaluate($query); 
$c = $ths->length; 

for ($i = 0; $i < $c; $i++) { 
    echo htmlentities($data->item($i)->nodeValue);  
} 

但這僅顯示從TD的文本值。當內容是鏈接時,它只顯示鏈接標題。不是網址。

UPDATE 感謝Fab的建議,我設法預定了一些進展。目前,我得到了以下內容:

$tables = $xpath->query('//table[@class="details"]'); 
foreach($tables as $table) { 
    $url = $xpath->evaluate('//th/a/@href', $table); 
    $articleName= $xpath->evaluate('//th/a', $table); 
    $Manufacturer= $xpath->evaluate('//th[text()="Manufacturer:"]/../td', $table); 

    echo 'articleName:' . $articleName . ' <br />'; 
    echo 'Manufacturer:' . $Manufacturer. ' <br />'; 
    echo 'url:' . $url. ' <br />'; 
    echo '<br />'; 
} 

但由於某些原因,它總是顯示從第一acticle(重複儘可能多的物品,因爲在頁面上)中的數據。就好像'foreach'語句總是返回第一個找到的表。有小費嗎?

回答

1

的XPath的網址是:

//table[@class="details"]//th/[email protected] 

而對於價格列:

//table[@class="details"]//th[text()="Price:"]/../td 

也許你會想單獨獲得URL,價格爲每個表,爲此,你可以先收集具有所有「詳細信息」表的DOMNodeList,然後在內部進行搜索(使用上下文參數):

$tables = $xpath->query('//table[@class="details"]'); 
foreach($tables as $table) { 
    $url = $xpath->evaluate('//th/[email protected]', $table); 
    $price = $xpath->evaluate('//th[text()="Price:"]/../td', $table); 
    echo "$url - $price <br>"; 
} 

UPDATE

我忘了一件事情:上下文參數只對相對路徑有效,//th/...是絕對的。你必須在一開始加點:.//th/...

看一看:working demo

(我也不得不爲query交換evaluate和顯式訪問的第一個項目的價值:

$xpath->query(...)->item(0)->nodeValue; 
+0

謝謝!我會嘗試的(我一直在關注獲取1查詢CFR中的所有信息,我如何用正則表達式來完成) – Walter81 2013-02-28 14:45:06

+0

我取得了一些進展,但仍有一些缺失..請參閱上面的更新。 – Walter81 2013-03-01 10:04:19

+0

我明白了。答案更新:) – 2013-03-01 10:20:12