C#爬网页内容除了直接调用网页的数据接口,另一种则是直接取得页面的HTML,然后对需要的内容进行获取,这个时候需要对整个页面的HTML进行DOM解析以及操作
.Net下解析HTML文件有很多种选择,个人发现比较好用的是 HtmlAgilityPack (点击可下载)
第一步,引用 HtmlAgilityPack.dll 并且使用它的命名空间名 using HtmlAgilityPack;
然后就是获取页面源码
HtmlAgilityPack.HtmlDocument htmlDoc = returnhtmlDoc(url); // 返回html源代码 public HtmlAgilityPack.HtmlDocument returnhtmlDoc(string url)//url为页面地址 { HttpWebRequest httpWebRequest = WebRequest.Create(url) as HttpWebRequest; HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse; Stream stream = httpWebResponse.GetResponseStream(); StreamReader reader = new StreamReader(stream, Encoding.UTF8); string s = reader.ReadToEnd(); reader.Close(); stream.Close(); httpWebResponse.Close(); HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(s); return htmlDoc; }
第二步,获取到内容后就是需要对需要的HTML标签进行内容获取
//获取div标签 id为content下的所有节点内容 HtmlNode content_1 = htmlDoc.DocumentNode.SelectNodes("//div[@id='content']"); //获取span标签 class为content下的第一个节点内容 HtmlNode content_2 = htmlDoc.DocumentNode.SelectSingleNode("//span[@class='content']"); //获取div标签 id为content下的span标签 class为text下的a标签节点内容 HtmlNode content_3 = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='content']//span[@class='text']//a"); //获取content_1下的HTML内容 string content_1_text = content_1[0].InnerHtml; //获取content_2下的文本内容 string content_2_text = content_2.InnerText; //获取content_3下a标签的href属性内容 string content_3_text = content_3.Attributes["href"].Value;