7
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(content);

var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"noprint res\"]/div");
if (nodes != null)
{
    foreach (HtmlNode data in nodes)
    {
                  // Works but not what I want
                  MessageBox.Show(data.InnerHtml);

                  // Should work ? but does not ?
                  MessageBox.Show(data.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText);
    }
}

foreachの初期ノードであるHTMLの結果を解析しようとしていますが、期待どおりに機能し、必要なものと一致する10個のアイテムの結果が得られます。

foreachに入ると、データ項目の内部htmlを出力すると正しいデータが表示されますが、SelectSingleNodeを出力すると、常にforeachの最初の項目のデータが表示されます。これは正常な動作ですか。何か間違ったことをしていますか?

この問題を解決するために、次のようなすべてのデータ項目のforeach内に新しいhtmlを作成する必要がありました。

HtmlAgilityPack.HtmlDocument innerDoc = new HtmlAgilityPack.HtmlDocument();
innerDoc.LoadHtml(data.InnerHtml);

// Select what I need
MessageBox.Show(innerDoc.DocumentNode.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText);

次に、アイテムごとの正しいデータを取得します。

私がデータを取得しようとしていたページはhttp://maps.google.com/maps?q=consulting+loc:+USでした。

基本的に私は会社名の左側の列を読んでいます、そして上記は起こります。

4

1 に答える 1

14

XPath式をで開始すると、ノード//を含むドキュメント全体を検索できます。data

".//[...]"内のノードのみをチェックするために使用できるはずですdata

于 2012-05-15T11:19:32.950 に答える