

در این مقاله تمرکز روی کتابخانهها و ابزارهای رایج برای پردازش و استخراج محتوا از صفحات HTML در اکوسیستم C#/.NET است. هدف این راهنما این است که به عنوان یک توسعهدهندهٔ پایتون سطح متوسط (با تجربهٔ برنامهنویسی) بتوانید انتخابی آگاهانه برای پروژههای وب اسکریپینگ خود داشته باشید: از استخراج سادهٔ داده تا سناریوهای پیچیدهٔ سازگاری با HTML5 و CSS3. در پایان هر بخش مثال کدی، توضیح ورودی/خروجی و نکات عملی دربارهٔ عملکرد، مدیریت خطا و امنیت خواهید دید.
در عمل انتخاب پارسر بر اساس چند معیار انجام میشود: پایداری در برابر HTML خراب (malformed)، پشتیبانی از انتخابگرهای CSS یا XPath، تطابق با استانداردهای مدرن، سرعت و مصرف حافظه، سهولت استفاده و میزان نگهداری (active maintenance). لیست پارسرهایی که بررسی میکنیم:
در ادامه هر گزینه را معرفی، کد نمونه و نکات عملی را میآوریم و در انتها جمعبندیِ تصمیمگیری خواهیم داشت.
HtmlAgilityPack یک کتابخانهٔ قدیمی و محبوب است که حالتی tolerant نسبت به HTML خراب دارد و از XPath و LINQ پشتیبانی میکند. برای اسکریپ کردن صفحات نامنظم یا گرفتن بخشهای مشخص (مثلاً المانهایی که تگها درست بسته نشدهاند) انتخاب مناسبی است.
using HtmlAgilityPack;
using System;
public static void Main()
{
var url = "https://quotes.toscrape.com/";
var web = new HtmlWeb();
var doc = web.Load(url);
var quotes = doc.DocumentNode.SelectNodes("//div[@class='quote']");
foreach (var quote in quotes)
{
var text = quote.SelectSingleNode(".//span[@class='text']");
Console.WriteLine(text.InnerText);
}
}توضیح کوتاه:
نکات خطبهخط: ابتدا HTML بارگذاری میشود، سپس با XPath المانهای مورد نظر انتخاب و متن داخلی استخراج میگردد. اگر SelectNodes برنگردد باید null-check انجام دهید تا NullReferenceException نگیرید.
نکات عملی و محدودیتها:
CsQuery سینتکس شبیه jQuery دارد و برای کسانی که با انتخابگرهای CSS و jQuery آشنا هستند یادگیری آسان است. معمولاً در پردازش سریع و استخراجهای دستهای عملکرد خوبی دارد.
using CsQuery;
using System;
public static void Main()
{
var url = "https://quotes.toscrape.com/";
var dom = CQ.CreateFromUrl(url);
var quotes = dom[".quote"];
foreach (var quote in quotes)
{
var text = quote.Cq().Find(".text").Text();
Console.WriteLine(text);
}
}توضیح:
نکات عملی:
AngleSharp تمرکز روی انطباق با استانداردهای مدرن وب (HTML5/CSS3) دارد و API قدرتمند و انعطافپذیری برای پردازش و حتی رندرینگ (تا حدی) ارائه میکند. اگر نیاز به پشتیبانی دقیق از CSS یا تجزیهٔ مدرن دارید، AngleSharp گزینهٔ اول است.
using AngleSharp;
using AngleSharp.Dom;
using System;
public static void Main()
{
var url = "https://quotes.toscrape.com/";
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
var document = context.OpenAsync(url).GetAwaiter().GetResult();
var quotes = document.QuerySelectorAll(".quote");
foreach (var quote in quotes)
{
var text = quote.QuerySelector(".text");
Console.WriteLine(text.InnerHtml);
}
}توضیح:
نکات عملی:
HtmlParserSharp یک پارسر سبک و بسیار سریع است که برای تحلیل صفحات بزرگ مناسب است. اگر اولویت شما پردازش سریع و کمحجم است و به قابلیتهای پیچیدهٔ DOM نیاز ندارید، این کتابخانه گزینهٔ مناسبی است.
using HtmlParserSharp;
using System;
public static void Main()
{
var url = "https://quotes.toscrape.com/";
var parser = new HtmlParserSharp.HtmlParser();
var document = parser.ParseUrl(url);
var quotes = document.SelectNodes("//div[@class='quote']");
foreach (var quote in quotes)
{
var text = quote.SelectSingleNode(".//span[@class='text']");
Console.WriteLine(text.InnerText);
}
}توضیح:
نکات عملی:
Fizzler خودِ یک پارسر مستقل نیست؛ بلکه یک موتور CSS selector است که معمولاً در کنار HtmlAgilityPack یا سایر پارسرها استفاده میشود تا قابلیت QuerySelector-style را اضافه کند. اگر با CSS selectors راحتاید و میخواهید آنها را به HtmlAgilityPack اضافه کنید، Fizzler راهحل مناسبی است.
using Fizzler.Systems.HtmlAgilityPack;
using HtmlAgilityPack;
using System;
public static void Main()
{
var url = "https://quotes.toscrape.com/";
var web = new HtmlWeb();
var doc = web.Load(url);
var quotes = doc.DocumentNode.QuerySelectorAll(".quote");
foreach (var quote in quotes)
{
var text = quote.QuerySelector(".text");
Console.WriteLine(text.InnerText);
}
}توضیح:
نکات عملی:
NSoup پورتی از Jsoup (جاوا) به دنیای .NET است و برای کسانی که با Jsoup آشنا هستند API مشابهی را فراهم میکند. برای اسکریپ کردن سریع صفحات و کسانی که سابقهٔ Jsoup دارند مناسب است.
using NSoup;
using System;
public static void Main()
{
var url = "https://quotes.toscrape.com/";
var doc = NSoupClient.Connect(url).Get();
var quotes = doc.Select(".quote");
foreach (var quote in quotes)
{
var text = quote.Select(".text").First();
Console.WriteLine(text.Text());
}
}توضیح:
نکات عملی:
صرفنظر از انتخاب پارسر، مجموعهای از ملاحظات فنی و حقوقی وجود دارد که باید رعایت کنید تا فرایند وب اسکریپینگ پایدار و امن باشد:
یک تصمیمگیری سریع:
همچنین ترکیبها کاربردیاند؛ مثلاً استفاده از HtmlAgilityPack + Fizzler یا ترجیح AngleSharp برای صفحات پیچیده و HtmlParserSharp برای پردازش دستهای حجیم.
هر پارسر مزایا و معایب خودش را دارد و انتخاب صحیح بستگی به نیاز پروژه (سازگاری با HTML خراب، نیاز به CSS/CSSOM، سرعت، مصرف حافظه و سهولت توسعه) دارد. برای پروژههای انعطافپذیر و نیازمند پشتیبانی از CSS پیشرفته، AngleSharp را امتحان کنید؛ برای مواردی که HTML نامنظم غالب است HtmlAgilityPack مناسبتر است؛ و اگر کار شما پردازش عظیم است HtmlParserSharp میتواند مزیت عملکردی بدهد. در همهٔ حالات، مدیریت درخواستها، رعایت اخلاق اسکریپ کردن، و پیادهسازی مناسب retry و timeout از ضروریات فنی هستند.

