我們已經有了一個帶有靜態信息的古老(內部)網站。我們將用更好的東西替換它,因此我需要獲取所有信息。我使用通過正則表達式做到這一點,但最近我偶然發現一些文章指出,使用正則表達式來解析來自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查詢CFR中的所有信息,我如何用正則表達式來完成) – Walter81 2013-02-28 14:45:06
我取得了一些進展,但仍有一些缺失..請參閱上面的更新。 – Walter81 2013-03-01 10:04:19
我明白了。答案更新:) – 2013-03-01 10:20:12