これを試してください:
Dictionary<string, string> values = new Dictionary<string, string>();
string key, date;
HtmlDocument doc = Load(html);
HtmlNode node = doc.DocumentNode.SelectSingleNode(".//table[@class='pricing detail']");
//this will pull out only the dates, and store them in variable 'date'
foreach(HtmlNode child in node.SelectNodes(".//tr[@class='left']")
{
date = child.GetInnerText;
}
//this will pull out the dates and the prices, and put them into a mapped data structure for easy (and quick!) referencing
foreach(HtmlNode child in node.SelectNodes(".//tr")
{
if(child.Attributes.contains("class"))
{
key = child.GetInnerText;
}
else
{
values.Add(key, child.GetInnerText);
}
}
次に、テキストを配列または文字列フォームに辞書に入れるだけです。
説明: 基本的に、foreach()
コードのビットは、属性に一致するテーブル内でのみ子を検索します<tr>
。次に、ノードのコレクションを反復処理し、ノードが日付かどうか (つまり、ノードが属性に一致するかどうか) を確認します<table class="pricing detail">
。一致する場合は、このノードの値 (GetInnerText ビット) が辞書として使用されます。キー (つまり、日付) 比較が false の場合、コードは、日付キーが変更されるまで、日付キーにマップされたディクショナリに後続の子ノードの値を追加します。
ディクショナリから出力に値を移行するために、それを簡単に実行できると確信しています
日付のフォーマットに関しては、ジェイコブの回答を参照してください。日付はすでに希望どおりにフォーマットされているように見えますが、彼は非常にうまくできています。
ここでは 2 つの foreach ループを用意しました。私はあなたが求めていることを完全に理解する前に実際に2番目のものを書きましたが、あなたがそれを使いたい場合に備えて残します.
注
: このコードは、意図的に柔軟性のあるものにはしていません... HTML の構造に非常に厳密に関連付けられています。私がこれを行った理由はいくつかあります...最初の理由は、効果的にスクレイピングする方法を学ぶ最善の方法は、使用するたびに完全にリタイアする必要のない柔軟なスクレイパーを強制的に作成することです。私はせっけん箱の上に立っていることを知っていますが、情報をスクレイピングするためのいくつかの原則を実際に理解すると、プログラムがはるかに簡単でスムーズになり、あえて言うなら...もっと楽しくなります...書いて維持する。2 つ目は、htmlagilitypack が提供する機能を実際に探索することをお勧めしたいということです。これは本当に印象的なライブラリであり、時間をかけて試してみる価値があります。