Muat turun harga Bitcoin menggunakan Html Agility Pack yang ditulis dalam C#
P粉156532706
P粉156532706 2023-09-05 17:17:03
0
1
720
<p>Saya perlu mendapatkan harga Bitcoin daripada https://coinmarketcap.com/currencies/bitcoin/ menggunakan Html Agility Pack. Saya menggunakan contoh ini dan ia berfungsi dengan baik: </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("Nama Nod: " + nod.Name + "n" + nod.OuterHtml);</pre> <p>XPath ialah: <kod>//*[@id="__next"]/div/div[1]/div[2]/div/div[1]/div[2]/div/ div[2]/div[1]/div</code></p> <p>Kod HTML: </p> <pre class="brush:php;toolbar:false;"><div class="priceValue "><span>$17,162.42</span></div></pre> <p>Saya mencuba kod berikut tetapi ia mengembalikan "Rujukan objek tidak ditetapkan kepada contoh objek": </p> <pre class="brush:php;toolbar:false;">var html = @"https://coinmarketcap.com/currencies/bitcoin/"; HtmlWeb web = new HtmlWeb(); var htmlDoc = web.Load(html); var node = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='priceValue']/span"); Console.WriteLine("Nod Name: " + nod.Name + "n" + nod.InnerText);`</pre></p>
P粉156532706
P粉156532706

membalas semua(1)
P粉729518806

TLDR:

  1. Anda perlu memberitahu HtmlWeb untuk menyahmampat respons (atau gunakan klien HTTP yang sesuai)
  2. Anda perlu membetulkan pemilih XPath

Jelas sekali, SelectSingleNode()调用返回null, kerana ia tidak dapat mencari nod.

Dalam kes ini, adalah berguna untuk memeriksa HTML yang dimuatkan. Anda boleh melakukan ini dengan mendapatkan nilai htmlDoc.DocumentNode.InnerHtml. Saya telah mencuba melakukan ini dan "HTML" yang dihasilkan tidak bermakna.

Alasannya ialah HtmlWebsecara lalai ia tidak menyahmampat respons yang diterima. Lihat iniisu github untuk mendapatkan butiran. Jika anda menggunakan klien HTTP yang betul (seperti yang ini), atau jika pembangun HtmlAgilityPack lebih proaktif, saya tidak fikir anda akan menghadapi masalah ini.

Jika anda berkeras untuk menggunakan HtmlWeb, kod anda sepatutnya kelihatan seperti ini:

const string html = @"https://coinmarketcap.com/currencies/bitcoin/";
        
var web = new HtmlWeb
{
    AutomaticDecompression = DecompressionMethods.GZip
};
HtmlDocument doc = web.Load(html);

HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='priceValue ']/span");

Sila ambil perhatian bahawa kelas elemen yang anda cari sebenarnya priceValue (末尾有一个空格字符),页面中还有另一个类为priceValuediv. Itu satu lagi soalan, walaupun, dan akhirnya anda akan dapat mencari pemilih yang lebih mantap. Boleh cuba ini:

HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[contains(@class, 'priceSection')]//div[contains(@class, 'priceValue')]/span");
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan