La meilleure chose à utiliser est HTMLAgilityPack . Vous pouvez également envisager d'utiliser Fizzler ou CSQuery en fonction de vos besoins pour sélectionner les éléments de la page récupérée. L'utilisation d'expressions LINQ ou Regukar est juste sujette aux erreurs, en particulier lorsque le HTML peut être malformé, manquer des balises de fermeture, avoir des éléments enfants imbriqués, etc.
Vous devez diffuser la page dans un objet HtmlDocument, puis sélectionner l'élément requis.
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();
[EDIT] En fait, supprimez ça. La méthode la plus simple consiste à utiliser FizzlerEx , une implémentation mise à jour de jQuery / CSS3-selectors du projet Fizzler original.
Exemple de code directement depuis leur site:
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;
}
Je ne pense pas que cela puisse être plus simple que cela.
Contains
appel peut être «assez bon».