首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 抓取網頁數據:提取
 標籤內 JSON 並反序列化

     編輯:程式設計綜合問答

問題場景

目標頁面返回的 HTML 結構為:

<html><body><pre>[{"year":"2015款","spec":[...]}]</pre></body></html>

需在 C# 中抓取 <pre> 標籤內的 JSON 字符串並解析為對象。

解決步驟

1. 獲取頁面源碼

using (var client = new HttpClient()) {
    string html = await client.GetStringAsync(url);
    // 或 WebClient (舊版)
    // string html = new WebClient().DownloadString(url);
}

2. 提取 <pre> 內容(正則 / HtmlAgilityPack)

// 方案 A:正則(簡單場景)
var match = Regex.Match(html, @"<pre>(.*?)</pre>", RegexOptions.Singleline);
string json = match.Success ? match.Groups[1].Value : "";

// 方案 B:HtmlAgilityPack(健壯、推薦)
var doc = new HtmlDocument();
doc.LoadHtml(html);
string json = doc.DocumentNode.SelectSingleNode("//pre").InnerText;

3. JSON 反序列化(Newtonsoft.Json / System.Text.Json)

// 定義對應模型
public class CarYear {
    public string year { get; set; }
    public int maxlen { get; set; }
    public List spec { get; set; }
}
public class Spec {
    public int id { get; set; }
    public string name { get; set; }
}

// 反序列化
var list = JsonConvert.DeserializeObject>(json); // Newtonsoft
// 或 .NET Core 3.1+
var list = System.Text.Json.JsonSerializer.Deserialize>(json);

4. 後續業務處理

foreach (var yearGroup in list) {
    Console.WriteLine($"年款: {yearGroup.year}, 車型數: {yearGroup.spec.Count}");
    foreach (var spec in yearGroup.spec) {
        Console.WriteLine($"  ID:{spec.id} 名稱:{spec.name}");
    }
}

完整控制台示例

using System;
using System.Net.Http;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using System.Collections.Generic;

class Program {
    static async Task Main() {
        string url = "https://example.com/api/cars";
        using (var http = new HttpClient()) {
            string html = await http.GetStringAsync(url);
            var match = Regex.Match(html, @"<pre>(.*?)</pre>", RegexOptions.Singleline);
            if (!match.Success) { Console.WriteLine("未找到 
 標籤"); return; }
            string json = match.Groups[1].Value;
            var data = JsonConvert.DeserializeObject>(json);
            // 業務邏輯...
        }
    }
}

關鍵點提示

  • 優先用 **HtmlAgilityPack** 解析 HTML,抗干擾能力強於正則。
  • JSON 庫選擇:Newtonsoft.Json 功能全、兼容舊版;System.Text.Json 性能高、無依賴(.NET Core 3.1+)。
  • 異常處理:網絡超時、HTML 結構變更、JSON 格式錯誤均需 try-catch 並記錄日誌。
  • 若目標站點有反爬蟲,需添加 User-Agent、Cookie、代理 IP 等策略。

核心邏輯:**HTTP 獲取 → HTML 解析提取 JSON 片段 → JSON 反序列化 → 業務處理**,三步走清晰可維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved