استفاده از HtmlAgility و CssSelectors

چهارشنبه 13 آبان 1394

در مثال زیر از (HtmlAgility (HAP برای بارگذاری HTML به صورت یک شی (DOM) استفاده میکنیم و تجزیه ان را به صورت یک گره بررسی می کنیم.

استفاده از HtmlAgility و CssSelectors

با استفاده از  HtmlAgility به تجزیه اسناد HTML  برای استخراج اطلاعات مربوط استفاده میکنیم. پسوند CssSelector یک سطح  جدید اضافه می کند و  به جمع آوری داده های مورد نیاز می پردازد. شاید به نظر مسئله گنگ باشد اما با توجه به توضیحات در ادامه مقاله و sample نمونه ای که قرار دادیم خواهید دید که این مطلب اسان است.

این پروژه شامل یک فایل HTML ساده است و آدرس در پروژه مورد نیاز است.

لینک هایی برای مطالعه  در مورد css , html را مشاهده نمایید.

برای تست بدون هیچ گونه تغییرات، شما نیاز به کپی کردن فایل HTML به ادرس زیر  دارید.

C:\testdata

HtmlAgility که تعدادی از کلاس های در دسترس  آن از جمله انواع شمارشی که نشان دهنده بخش های مختلف از DOMهستند استفاده می شود، این کلاس ها شامل HtmlAttribute، HtmlAttributeCollection، HtmlCommentNode و غیره می باشد.

اولین کلاس برای بررسی، کلاس HtmlDocument است. این کلاس دارای method هایی برای بارگذاری و تجزیه سند به بخش مربوطه آن است.

 از هر بخش از کد  از نامگذاری (X) استفاده میکنیم که در آن X یک عدد است استفاده می شود.

برای استفاده ، خط زیر اجرا می شود:

HtmlAgilityPack.agpack = new HtmlAgilityPack.HtmlDocument();

method بعدی متدی را صدا میکند. که برای بارگذاری سند است. شما می توانید  از رشته  بارگذاری کنید

agpack.LoadHtml(Html string) 
//or from a resource - 
agpack.Load(@"c:\testdata\testdat.htm");

شما می توانید خطا ها را جستجو کنید .

var errors = agpack.ParseErrors;

هنگامی که سند پر شده است، دو Method اصلی زیر برای  جستجو می باشد.

SelectNodes(string XPath)  // from the DocumentNode
GetElementbyId(string Id) // from the HtmlDocument

(قسمت 3)

شما می توانید کد زیر را برای دریافت نظر استفاده کنید:

var comment = agpack.DocumentNode.SelectNodes("//comment()[contains(., 'Start Table:')]");

var html = Regex.Match(agpack.DocumentNode.InnerHtml,@"<!-- Start Table: \d* -->(?<one>.*)<!-- End Table -->",RegexOptions.Singleline).Groups[1];

(قسمت 5)

کد زیر نگاهی به table موجود با نام abc می اندازد.

var node = agpack.GetElementbyId("abc");

این کد یک گره به نمایندگی از جدول  بر میگرداند.innerHTML شامل تمام متن های بین تگ <table> </ table>  می باشد. همچنین میخواهیم شامل مجموعه ای از گره به نمایندگی از ساختار dom باشد.

(قسمت 6)

کد زیر یک رویکرد برای گرفتن گره ردیف است با استفاده از LINQ آنها را کشف میکنیم، مانند زیر:

var rownodes = node.ChildNodes.Where(w => w.OriginalName == "tr");

روش دیگر استفاده از SelectNodes در گره به کشف عناصر TR موجود در table است.

rownodes = node.SelectNodes("tr");

اما این هم نمی تواند همه ردیف ها را پیدا کند .و فقط برای پیدا کردن immediate children ان است

2 راه حل زیر پیشنهاد می شود.

rownodes = node.SelectNodes(node.XPath + "//tr");

//or

// http://www.w3schools.com/xsl/xpath_axes.asp
rownodes = node.SelectNodes("descendant::tr");


به طور مشابه، ما می توانیم تمام عناصر TD عناصر TR را با استفاده از رویه های مشابه پیدا کنیم. 

(قسمت 7)

node = null;
node = agpack.GetElementbyId("table3")
nodes = node.SelectNodes("descendant::td");

حرکت کردن روی HAP.CssSelectors

HAP.CssSelectors بالای بسته HtmlAgility قرار دارد و در واقع اطمینان حاصل می شود که آن را به عنوان بخشی از بسته NuGet نصب  کرده ایم.

HAP.CssSelectors اجازه می دهد به شما  عناصر را با استفاده از انتخابگرهای CSS انتخاب کنید به جای استفاده از XPath . برای مثال:

  (قسمت 8)

rownodes = agpack.QuerySelectorAll("#abc tr");

در این مورد  پیدا کردن گره لازم نیست، به سادگی از کل سند آن را بازگشت میدهیم.  4 ردیف مورد انتظار را برمیگردانیم.

listTDNodes = agpack.QuerySelectorAll("#table3 td");

listTDNodes = agpack.QuerySelectorAll("#table3 tr:nth-child(2) td");

listTDNodes = agpack.QuerySelectorAll(".table");

کد بالا جدول اول و سوم را برمی گرداند .

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 1k بازدید
  • 1 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید