我是 C# 編程的新手。我正在嘗試從 div 中抓取資料(我想在 Forms 應用程式中顯示網頁中的溫度)。這是我的代碼:
private void btnOnet_Click(object sender, EventArgs e)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
HtmlWeb web = new HtmlWeb();
doc = web.Load("https://pogoda.onet.pl/");
var temperatura = doc.DocumentNode.SelectSingleNode("/html/body/div[1]/div[3]/div/section/div/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]");
onet.Text = temperatura.InnerText;
}
這是一個例外:
System.NullReferenceException:溫度為空。
uj5u.com熱心網友回復:
你可以使用這個:
public static bool TryGetTemperature(HtmlAgilityPack.HtmlDocument doc, out int temperature)
{
temperature = 0;
var temp = doc.DocumentNode.SelectSingleNode(
"//div[contains(@class, 'temperature')]/div[contains(@class, 'temp')]");
if (temp == null)
{
return false;
}
var text = temp.InnerText.EndsWith("°") ?
temp.InnerText.Substring(0, temp.InnerText.Length - 5) :
temp.InnerText;
return int.TryParse(text, out temperature);
}
如果您使用 XPath,您可以更精確地選擇您的目標。隨著您的查詢,HTML 結構的一點變化,您的應用程式將失敗。幾點:
- // 是在檔案的任何地方搜索
- 您搜索任何包含“溫度”類的 div,并在該節點內:
- 你用“temp”類搜索一個 div 孩子
- 如果您獲得該節點(!= null),則嘗試轉換度數(之前洗掉“°”)
并檢查:
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
HtmlWeb web = new HtmlWeb();
doc = web.Load("https://pogoda.onet.pl/");
if (TryGetTemperature(doc, out int temperature))
{
onet.Text = temperature.ToString();
}
更新
我更新了一些 TryGetTemperature 因為度數是編碼的。主要問題是HTML。當您請求源代碼時,您會得到一些瀏覽器稍后會動態更新的 HTML。因此,您獲得的 HTML 對您無效。它不包含溫度。
所以,我看到了兩種選擇:
- 您可以使用瀏覽器控制元件(在 Common Controls -> WebBrowser 中,在帶有按鈕、標簽的表單工具中),插入表單并導航到頁面。這并不難,但你需要學習一些東西:等待頁面下載的事件,然后從控制元件中獲取源代碼。另外,我想你會想要隱藏瀏覽器控制元件。請注意,如果您隱藏,有時瀏覽器將無法正常作業。在這種情況下,您可以使用桌面外的可見表單并管理激活事件以避免激活此視窗。此外,隱藏任務視窗 (Alt Tab)。事情以這種方式變得更難,但有時是唯一的方法。
- 簡單的方法是搜索您想要的位置(例如:Madryt)并在 DevTools 中查看完成的請求(例如:https ://pogoda.onet.pl/prognoza-pogody/madryt-396099 )。使用此 URL,您將獲得有效的 HTML。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462922.html
上一篇:如何避免網路報廢中的回圈中斷?
