Лучше всего использовать 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-селекторов исходного проекта 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
звонок может быть «достаточно хорошим».