好吧,让我们这样做。我们将首先将数据加载到 HTML 解析器中,然后从中创建一个 XPath 解析器。XPath 将帮助我们轻松地浏览 HTML。所以:
$date = "20110509";
$data = file_get_contents("http://online.wsj.com/mdc/public/page/2_3021-tradingdiary2-{$date}.html?mod=mdc_pastcalendar");
$doc = new DOMDocument();
@$doc->loadHTML($data);
$xpath = new DOMXpath($doc);
现在我们需要获取一些数据。首先让我们获取所有数据表。查看源代码,这些表由以下类表示mdcTable
:
$result = $xpath->query("//table[@class='mdcTable']");
echo "Tables found: {$result->length}\n";
至今:
$ php test.php
Tables found: 5
好的,所以我们有桌子。现在我们需要获取特定的列。因此,让我们使用您提到的最新关闭列:
$result = $xpath->query("//table[@class='mdcTable']/*/td[contains(.,'Latest close')]");
foreach($result as $td) {
echo "Column contains: {$td->nodeValue}\n";
}
到目前为止的结果:
$ php test.php
Column contains: Latest close
Column contains: Latest close
Column contains: Latest close
... etc ...
现在我们需要列索引来获取特定行的特定列。我们通过计算所有先前的兄弟元素,然后添加一个来做到这一点。这是因为元素索引选择器是 1 索引的,而不是 0 索引的:
$result = $xpath->query("//table[@class='mdcTable']/*/td[contains(.,'Latest close')]");
$column_position = count($xpath->query('preceding::*', $result->item(0))) + 1;
echo "Position is: $column_position\n";
结果是:
$ php test.php
Position is: 2
现在我们需要获取我们的特定行:
$data_row = $xpath->query("//table[@class='mdcTable']/*/td[starts-with(.,'Closing Arms')]");
echo "Returned {$data_row->length} row(s)\n";
这里我们使用starts-with
,因为行标签中有一个 utf-8 符号。这使它更容易。到目前为止的结果:
$ php test.php
Returned 4 row(s)
现在我们需要使用列索引来获取我们想要的数据:
$data_row = $xpath->query("//table[@class='mdcTable']/*/td[starts-with(.,'Closing Arms')]/../*[$column_position]");
foreach($data_row as $row) {
echo "{$date},{$row->nodeValue}\n";
}
结果是:
$ php test.php
20110509,1.26
20110509,1.40
20110509,0.32
20110509,1.01
现在可以将其写入文件。现在,我们没有这些适用的市场,所以让我们继续抓住那些:
$headings = array();
$market_headings = $xpath->query("//table[@class='mdcTable']/*/td[@class='colhead'][1]");
foreach($market_headings as $market_heading) {
$headings[] = $market_heading->nodeValue;
}
现在我们可以使用计数器来引用我们所在的市场:
$data_row = $xpath->query("//table[@class='mdcTable']/*/td[starts-with(.,'Closing Arms')]/../*[$column_position]");
$i = 0;
foreach($data_row as $row) {
echo "{$date},{$headings[$i]},{$row->nodeValue}\n";
$i++;
}
输出为:
$ php test.php
20110509,NYSE,1.26
20110509,Nasdaq,1.40
20110509,NYSE Amex,0.32
20110509,NYSE Arca,1.01
现在为您服务:
- 这可以做成一个带日期的函数
- 您需要代码来写出文件。查看文件系统函数以获取提示
- 这可以扩展为使用不同的列和不同的行