Najlepszą rzeczą do użycia jest HTMLAgilityPack . Możesz również przyjrzeć się użyciu Fizzlera lub CSQuery w zależności od potrzeb w zakresie wybierania elementów z pobranej strony. Używanie wyrażeń LINQ lub Regukar jest po prostu podatne na błędy, zwłaszcza gdy HTML może być zniekształcony, brakuje tagów zamykających, ma zagnieżdżone elementy podrzędne itp.
Musisz przesłać strumieniowo stronę do obiektu HtmlDocument, a następnie wybrać wymagany element.
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();
[EDYCJA] Właściwie, wyrzuć to. Najprostszą metodą jest użycie FizzlerEx , zaktualizowanej implementacji selektorów jQuery / CSS3 z oryginalnego projektu Fizzlera.
Przykład kodu bezpośrednio z ich witryny:
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;
}
Nie sądzę, żeby było to prostsze.
Contains
wezwanie może być „wystarczająco dobre”.