このページから会社名にアクセスしようとしています。
「Cascade Corporation」の内部テキストを持つノードを返す必要がありますが、代わりに null が返されます。
HtmlNode htest = document.DocumentNode.SelectSingleNode("//*[@id='appbar']/div/div[2]/div[1]/span");
私は何が欠けていますか?
PS は Chrome で動作する必要があります
このページから会社名にアクセスしようとしています。
「Cascade Corporation」の内部テキストを持つノードを返す必要がありますが、代わりに null が返されます。
HtmlNode htest = document.DocumentNode.SelectSingleNode("//*[@id='appbar']/div/div[2]/div[1]/span");
私は何が欠けていますか?
PS は Chrome で動作する必要があります
あなたの問題を自分のマシンで再現しようとしました。Fiddler を使用して要求と応答のデータをキャプチャしました。ブラウザからレンダリングされた html 出力が私のコードと異なることに気づき、驚きました。
Fiddler から私が気づいた違いは、ユーザー エージェントの値です。後でこのコードを思いつきましたが、うまくいきました。試してみて、私に知らせてください。私に反対票を投じないでください。私はあなたを助けようとしています..
string url = "http://www.google.com/finance?q=NASDAQ:TXN&fstype=ii";
HtmlWeb web = new HtmlWeb();
web.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0"; // latest firefox
HtmlDocument doc = web.Load(url);
var node = doc.DocumentNode.SelectSingleNode("//*[@id='appbar']/div/div[2]/div[1]/span")
//var node = doc.DocumentNode.SelectSingleNode("//div[@class='appbar-snippet-primary']/span")
ユーザー エージェントの行にコメントすると、問題を再現できます。それが役に立てば幸い。
リンク先のページには、id を持つ要素はありませんappbar
。クラスが呼び出された div のみがありappbar-hide
、それがソースに appbar が存在する唯一の場所です。
このような問題に直面したときは、段階的なアプローチを試してください。最初に xpath の最初のノードを選択します。つまり、最初HtmlNode htest = document.DocumentNode.SelectSingleNode("//*[@id='appbar']");
に null を返すノード (この場合はこれになります) を選択し、エラーの場所を見つけます。次に、エラーを修正し、残りが問題ないと確信できる場合は、完全な xpath を再試行します。その後、再度エラーが発生した場合は、2 番目の要素に戻ります。//*[@id='appbar']/div
必要な要素が得られるまで、このように進みます