สิ่งที่ดีที่สุดที่จะใช้เป็นHTMLAgilityPack คุณยังสามารถดูโดยใช้FizzlerหรือCSQuery ได้ขึ้นอยู่กับความต้องการของคุณในการเลือกองค์ประกอบจากหน้าที่ดึงข้อมูล การใช้ LINQ หรือ Regukar Expressions เป็นเพียงการเกิดข้อผิดพลาดโดยเฉพาะอย่างยิ่งเมื่อ HTML มีรูปแบบไม่ถูกต้องไม่มีแท็กปิดมีองค์ประกอบย่อยซ้อนกันเป็นต้น
คุณต้องสตรีมเพจไปยังอ็อบเจ็กต์ HtmlDocument จากนั้นเลือกองค์ประกอบที่คุณต้องการ
var doc = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlNode.ElementsFlags["br"] = HtmlAgilityPack.HtmlElementFlag.Empty;
doc.OptionWriteEmptyNodes = true;
try
{
var webRequest = HttpWebRequest.Create(pageUrl);
Stream stream = webRequest.GetResponse().GetResponseStream();
doc.Load(stream);
stream.Close();
}
catch (System.UriFormatException uex)
{
Log.Fatal("There was an error in the format of the url: " + itemUrl, uex);
throw;
}
catch (System.Net.WebException wex)
{
Log.Fatal("There was an error connecting to the url: " + itemUrl, wex);
throw;
}
string testDivSelector = "//div[@id='test']";
var divString = doc.DocumentNode.SelectSingleNode(testDivSelector).InnerHtml.ToString();
[แก้ไข] ที่จริงเรื่องที่สนใจ วิธีที่ง่ายที่สุดคือใช้FizzlerExซึ่งเป็น jQuery / CSS3-selectors ที่ปรับปรุงแล้วของโครงการ Fizzler ดั้งเดิม
ตัวอย่างโค้ดโดยตรงจากไซต์ของพวกเขา:
using HtmlAgilityPack;
using Fizzler.Systems.HtmlAgilityPack;
var web = new HtmlWeb();
var document = web.Load("http://example.com/page.html");
var page = document.DocumentNode;
foreach(var item in page.QuerySelectorAll("div.item"))
{
var title = item.QuerySelector("h3:not(.share)").InnerText;
var date = DateTime.Parse(item.QuerySelector("span:eq(2)").InnerText);
var description = item.QuerySelector("span:has(b)").InnerHtml;
}
ฉันไม่คิดว่ามันจะง่ายไปกว่านั้น
Containsเรียกง่ายๆอาจจะ "ดีพอ"