從網頁擷取結構化資料是常見需求。本文示範使用 WebClient 下載頁面、正則表達式 解析 Meta 標籤與圖片連結、以及移除 HTML 標籤取純文字的完整流程。
public static string DownloadPage(string url)
{
if (string.IsNullOrWhiteSpace(url)) return null;
using (var wc = new WebClient())
{
wc.Encoding = Encoding.UTF8; // 關鍵:指定編碼避免亂碼
wc.Headers["User-Agent"] = "Mozilla/5.0 (compatible; C# Crawler)";
try
{
return wc.DownloadString(url);
}
catch (WebException ex)
{
// 記錄錯誤
return null;
}
}
}
注意: .NET Core / 5+ 建議改用 HttpClient,WebClient 已標記過時。
public static string ExtractTitle(string html)
{
var match = Regex.Match(html, @"]*>(.*?) ",
RegexOptions.IgnoreCase | RegexOptions.Singleline);
return match.Success ? HttpUtility.HtmlDecode(match.Groups[1].Value.Trim()) : null;
}
public static string ExtractDescription(string html)
{
// 支援 name="description" 或 property="og:description"
var pattern = @"]+)";
var match = Regex.Match(html, pattern, RegexOptions.IgnoreCase);
return match.Success ? HttpUtility.HtmlDecode(match.Groups[1].Value.Trim()) : null;
}
public static List ExtractImageUrls(string html, string baseUrl = null)
{
var urls = new List();
// 匹配
,支援單雙引號、屬性順序不固定
var regex = new Regex(@"
]*\bsrc\s*=\s*[""']?([^""'>\s]+)", RegexOptions.IgnoreCase);
foreach (Match m in regex.Matches(html))
{
string src = m.Groups[1].Value;
// 處理相對路徑
if (!string.IsNullOrEmpty(baseUrl) && !Uri.IsWellFormedUriString(src, UriKind.Absolute))
{
src = new Uri(new Uri(baseUrl), src).AbsoluteUri;
}
urls.Add(src);
}
return urls.Distinct().ToList();
}
public static string StripHtml(string html)
{
if (string.IsNullOrEmpty(html)) return string.Empty;
// 1. 移除 Script/Style 區塊
html = Regex.Replace(html, @"<(script|style)\b[^>]*>.*?\1>", "",
RegexOptions.IgnoreCase | RegexOptions.Singleline);
// 2. 移除所有標籤
html = Regex.Replace(html, @"<[^>]+>", " ");
// 3. 解碼 HTML 實體 ( < & 等)
html = HttpUtility.HtmlDecode(html);
// 4. 合併多餘空白
html = Regex.Replace(html, @"\s+", " ").Trim();
return html;
}
public class SimpleCrawler
{
public PageInfo Crawl(string url)
{
string html = DownloadPage(url);
if (html == null) return null;
return new PageInfo
{
Url = url,
Title = ExtractTitle(html),
Description = ExtractDescription(html),
ImageUrls = ExtractImageUrls(html, url),
TextContent = StripHtml(html)
};
}
}
public class PageInfo
{
public string Url { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public List ImageUrls { get; set; }
public string TextContent { get; set; }
}
Ude.NetStandard)。User-Agent、Referer、Cookie 容器、請求間隔隨機化。Selenium、PuppeteerSharp 或 Playwright 驅動真實瀏覽器。robots.txt、網站服務條款、資料隱私法規 (GDPR、個資法)。本文提供零相依、純 .NET Framework/Core 可用的基礎爬蟲工具組。理解正則解析邏輯有助於除錯,但複雜專案請改用成熟的 HTML 解析庫。