C# で書かれた Html Agility Pack を使用してビットコインの価格をダウンロードする
P粉156532706
2023-09-05 17:17:03
<p>HTML Agility Pack を使用して、https://coinmarketcap.com/currency/bitcoin/ からビットコインの価格を取得する必要があります。私はこの例を使用していますが、正常に動作します: </p>
<pre class="brush:php;toolbar:false;">var html = @"http://html-agility-pack.net/";
HtmlWeb web = new HtmlWeb();
var htmlDoc = web.Load(html);
var node = htmlDoc.DocumentNode.SelectSingleNode("//head/title");
Console.WriteLine("ノード名: "node.Name"\n"node.OuterHtml);</pre>
<p>XPath は: <code>//*[@id="__next"]/div/div[1]/div[2]/div/div[1]/div[2]/div/ div[2]/div[1]/div
<p>HTML コード: </p>
<pre class="brush:php;toolbar:false;"><div class="priceValue "><span>$17,162.42</span></div></pre>
<p>次のコードを試してみましたが、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という結果が返されました。 </p>
<pre class="brush:php;toolbar:false;">var html = @"https://coinmarketcap.com/currency/bitcoin/";
HtmlWeb web = new HtmlWeb();
var htmlDoc = web.Load(html);
var node = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='priceValue']/span");
Console.WriteLine("ノード名: "node.Name"\n"node.InnerText);`</pre></p>
TLDR:
HtmlWeb
に指示する必要がありますどうやら、
SelectSingleNode()
呼び出しでは、ノードが見つからないため、null
が返されます。この場合、ロードされた HTML を検査すると役に立ちます。これを行うには、
htmlDoc.DocumentNode.InnerHtml
の値を取得します。これを実行してみましたが、生成された「HTML」は意味がありません。その理由は、
HtmlWeb
がデフォルトでは受信した応答を解凍しないためです。詳細については、この github の問題を参照してください。適切な HTTP クライアント (this など) を使用していれば、または HtmlAgilityPack 開発者がより積極的であれば、この問題は発生しないと思います。どうしても
リーリーHtmlWeb
を使用する場合、コードは次のようになります。探している要素のクラスは実際には
priceValue
(末尾にスペース文字があります) であることに注意してください。クラスpriceValue# を持つ別の
がページ上にあります。 ## ディビジョン。ただし、それは別の問題であり、最終的にはより堅牢なセレクターが見つかるはずです。おそらくこれを試してみてください:
リーリー