最好的办法发挥出色,采用的是HTMLAgilityPack。您也可以使用Fizzler或CSQuery,根据您的需要选择检索页面中的元素。使用LINQ或Regukar表达式只是为了容易出错,尤其是当HTML格式错误,缺少结束标签,嵌套子元素等。
您需要将页面流式传输到HtmlDocument对象中,然后选择所需的元素。
// Call the page and get the generated HTML
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;
}
//get the div by id and then get the inner text
string testDivSelector = "//div[@id='test']";
var divString = doc.DocumentNode.SelectSingleNode(testDivSelector).InnerHtml.ToString();
[编辑] 实际上,该报废。最简单的方法是使用FizzlerEx,这是最初的Fizzler项目的更新的jQuery/CSS3选择器实现。直接从他们的网站
代码示例:
using HtmlAgilityPack;
using Fizzler.Systems.HtmlAgilityPack;
//get the page
var web = new HtmlWeb();
var document = web.Load("http://example.com/page.html")
var page = document.DocumentNode;
//loop through all div tags with item css class
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”调用可能“足够好”。 – ashes999
使用HTMLAgility pack,Fizzler或CSQuery来获得div /文本,一旦你有了HTML,其他的都很容易出错。 – jammykam
可能的重复[如何在C#中下载HTML源代码](http://stackoverflow.com/questions/599275/how-can-i-download-html-source-in-c-sharp) –