Kullanılacak en iyi şey HTMLAgilityPack'tir . Ayrıca , alınan sayfadaki öğeleri seçme ihtiyaçlarınıza bağlı olarak Fizzler veya CSQuery kullanmayı da inceleyebilirsiniz . LINQ veya Regukar İfadelerini kullanmak, özellikle HTML hatalı biçimlendirilebildiğinde, kapanış etiketleri eksik olduğunda, iç içe geçmiş alt öğelere sahip olduğunda vb. Hataya açıktır.
Sayfayı bir HtmlDocument nesnesine aktarmanız ve ardından gerekli öğeyi seçmeniz gerekir.
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();
[DÜZENLE] Aslında bunu bir kenara bırakın. En basit yöntem kullanmaktır FizzlerEx , orijinal Fizzler projenin güncelleştirilmiş jQuery / CSS3-seçiciler uygulanmasını.
Doğrudan kendi sitelerinden kod örneği:
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;
}
Bundan daha basit olabileceğini sanmıyorum.
Contains
arama "yeterince iyi" olabilir.