需要先在项目中引用HtmlAgilityPack.dll
解析html时,最常见的场景是在列表页抓取到列表内容,然后做循环根据列表中标题的超链接抓取详情内容。
要抓取的目标网页核心html内容:
<div class="list">
<ul>
<li><a href="/detail.aspx?id=48">新闻标题1</a><span>2017-1-11</span></li>
<li><a href="/detail.aspx?id=47">新闻标题2</a><span>2017-1-10</span></li>
</ul>
</div>
C#代码:
string content = GetUrlHtml("http://xxxx.com/newslist.aspx", "gb2312"); //获取目标网页的html
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(content);
HtmlNode contentNode = doc.DocumentNode.SelectSingleNode("//div[@class='list' ]/ul"); //列表内容所在的大区域
HtmlNodeCollection list = contentNode.SelectNodes("li"); //生成循环
foreach(HtmlAgilityPack.HtmlNode item in list)
{
var a = item.SelectSingleNode("a");
var txt = a.InnerText; //标题
var href = a.Attributes["href"].Value; //详情地址
var dt = item.SelectSingleNode("span").InnerText; //时间
var detail = GetUrlHtml(href, "gb2312"); //获得详情页html,再进行解析获得最终内容
//插入数据库
}
private string GetUrlHtml(string url, string code = "utf-8")
{
try
{
WebRequest rGet = WebRequest.Create(url);
WebResponse rSet = rGet.GetResponse();
Stream s = rSet.GetResponseStream();
StreamReader reader = new StreamReader(s, Encoding.GetEncoding(code));
return reader.ReadToEnd();
}
catch (WebException)
{
//连接失败
return "";
}
}