1

単純な数値文字列について、Webページ(コードを参照)(および過去にさかのぼるページ(ページ自体に日付「20110509」が表示されます))をスクレイピングしようとしています。必要なテーブル内の特定のデータを解析する方法を、多くの試行錯誤(プログラミングは初めて)で理解できないようです。私はカールなどのない単純なPHP/HTMLを使おうとしています。これは可能ですか?私の主な問題は、ソースコードからデータを取得するために必要な区切り文字を使用することだと思います。

私が欲しいのは、プログラムが最初のページ、たとえば「20050101」から開始し、現在の日付まで各ページをスキャンして、特定のデータ、たとえば「latestclose」(列)を取得することです。 )、 "closeing arm"(行)、および対応する日付の値を単一の.txtファイルにエクスポートし、日付を値からコンマで区切ります。プログラムを実行するたびに、日付/値を既存のテキストファイルに追加する必要があります。

以下のコードの多くの行がジャンクであることを認識しています。これは私の学習プロセスの一部です。

<html>
<title>HTML with PHP</title>
<body>

<?php

$rawdata = file_get_contents('http://online.wsj.com/mdc/public/page/2_3021-tradingdiary2-20110509.html?mod=mdc_pastcalendar');
//$data = substr(' ', $data);
//$begindate = '20050101';
//$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B"); 
//if (preg_match(' <td class="text"> ' , $data , $content)) {
//$content = str_replace($newlines

echo $rawdata;
///file_put_contents( 'NYSETRIN.html' , $content , FILE_APPEND);

?>

<b>some more html</b>

<?php
?>

</body>
</html>
4

2 に答える 2

3

よし、これをやろう。最初にデータを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インデックスではなく、1インデックスであるためです。

$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

今あなたの部分のために:

  • これは、日付を取る関数にすることができます
  • ファイルを書き出すためのコードが必要になります。ヒントについては、ファイルシステム関数を確認してください
  • これは、さまざまな列とさまざまな行を使用するように拡張可能にすることができます
于 2011-05-28T17:19:19.107 に答える
2

HTMLドキュメント内の特定のコンテンツを検索するのに非常に便利なHTMLパーサーであるHTMLAgilityPackを使用することをお勧めします。

于 2011-05-28T16:18:39.227 に答える