HtmlAgility是一个开源的Html解析库,据说是C#版的JQuery,功能非常强大。
该篇学习它的解析功能,还可以模拟用户请求,创建html,设置代理等等,暂先不研究。
----------------------------------------------------------------------------
1.简单例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;using HtmlAgilityPack;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
HtmlWeb webClient = new HtmlWeb();
HtmlDocument doc = webClient.Load("http://www.baidu.com");
var rootNode = doc.DocumentNode;
HtmlNodeCollection categoryNodeList = rootNode.SelectNodes("//html[1]/body[1]");
foreach (var item in categoryNodeList)
{
Console.WriteLine("item: " + item.Name);
}Console.Read();
}
}
}
算是第一个Hellow world,扒的百度页面。
----------------------------------------------------------------------------
2.读取
那么,如果是载入本地的Html或者直接读流,字符串。可以这么做
HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\xxx.mht", Encoding.UTF8, false);
public void LoadHtml(string html);//直接读字符串化的html
public void Load(Stream stream);//流
public void Load(string path);//本地路径
HtmlDocumen其本身也提供检测编码的方法。
HtmlWeb主要是自动检测编码,如果要自定义编码可以改其中属性。OverrideEncoding, AutoDetectEncoding。而HtmlDocument对编码的操作反而不一样,指定在参数中,估计是自动检测编码已经很强大了把,很少要自己指定。。。。
----------------------------------------------------------------------------
3.节点选择
rootNode.SelectNodes
rootNode.SelectSingleNode
选择节点和选择单个节点。
用SelectNodes为例,看一下参数
rootNode.SelectNodes("//html[1]/body[1]");
"//"双斜杠表示从根节点查找所有子节点
"/"单斜杠表示只查找第一层子节点
"./"点斜杠表示从当前节点开始查找
[]中括号中的代表相同名字的子节点索引。
var resultList = rootNode.SelectNodes("//html[1]/body[1]/div[1]/div[position()<5]");//取前4个元素
resultList = rootNode.SelectNodes("//html[1]/body[1]/div[1]/div[last()]");//取最后1个元素
resultList = rootNode.SelectNodes("//html[1]/body[1]/div[1]/div[@id]");//取所有有id属性的元素
resultList = rootNode.SelectNodes("//html[1]/body[1]/div[1]/div[@id=‘head‘]");//取属性id值为head的元素
更多属性可以在W3SCHOOL查看http://www.w3school.com.cn/xpath/xpath_functions.asp
取属性
doc.Attributes["id"];
取元素
doc.GetElementbyId("id");
HTML解析利器-HtmlAgility学习,布布扣,bubuko.com