HtmlAgilityPack快速实现网页爬虫
在之前项目中,如果要获取网页内的信息,都是用WebRequest获取网站源码,
然后自己用正则等方法匹配解析
正则写起来费时费力,易用性太差。
随即今天使用HtmlAgilityPack来实现高效的抓取DOM节点信息的获取
在.NET技术下,解析html工具也很多,比如很多人可能会使用htmlparser,或者微软的MSHTML,htmlparser虽然比较易上手,但是相对应的解析速度较慢,而Html Agility Pack解析速度相当快,并且开源,易用,它可以帮助我们解析html文档就像用XmlDocument类来解析xml一样轻松、方便。
1.安装HtmlAgilityPack
创建HtmlDocument实例
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(_html);
//_html 是通过WebRequest获取的网页源码字符串
2.获取指定 Class的文本内容
例:获取 class=‘top_title’ 元素内的文本内容
string title = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='main']").SelectSingleNode("//h2 [@class='top_title']").InnerText;
返回:
3D全景伯尼桑德斯总统竞选演讲
3.枚举节点
例:获取 maincontent 元素内 第二个p节点内容
string lg = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='maincontent']").SelectNodes("//p")[1].InnerText;
返回:
视频语言:英语
4.获取指定元素的属性值
例:获取 a标签的href内容
string url = htmlDoc.DocumentNode.SelectSingleNode("//div [@id='voddownarea']").SelectNodes("//a")[0].GetAttributeValue("href", "");
返回:
http://d1.vrhd8.com:8003/vrdata/1172/[www.vrhd8.com]3D全景伯尼桑德斯总统竞选演讲.rar
5.示例总结
1.通过id 定位 header下的blogTitle节点信息
HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//div[@id='header']/div[@id='blogTitle']");
2.通过索引定位,div[2]是标识根节点的第二个
HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//div[2]/div[1]");
3.通过当前 titleNode节点,获取h1的节点
HtmlNode IDNode = titleNode.SelectSingleNode("./h1");
4.获取节点文本内容
IDNode.OuterHtml:属性返回的是包含当前节点的Html代码在内的所有Html代码
IDNode.InnerHtml:属性返回的是当前节点里面子节点的所有Html代码
IDNode.InnerText:属性过滤掉了所有的Html标记代码,只返回文本值
5.获取某个标签所有节点
HtmlNodeCollection uiListNodes = doc.DocumentNode.SelectNodes("//ui[@id='navList']/li");