HTML解析- HtmlAgilityPack 大家做过Python爬虫会发生Python有非常牛的库工具,像beatufulsoup等库,做爬页面确实非常方便。 HtmlAgilityPack是.net下的一个HTML解析类库。支持用XPath来解析HTML。这个意义不小,为什么呢?因为对于页面上的元素的xpath某些强大的浏览器能够直接获取得到,并不需要手动写。节约了大半写正则表达式的时间,当然正则表达式有时候在进一步获取的时候还需要写,但是通过xpath解析之后,正则表达式已经要匹配的范围已经非常小了。而且,不用正则表达式在整个页面源代码上匹配,速度也会有提升。总而言之,通过该类库,先通过浏览器获取到xpath获取到节点内容然后再通过正则表达式匹配到所需要的内容,无论是开发速度,还是运行效率都有提升。 HtmlAttribute Html元素的属性 HtmlAttributeCollection 一个元素属性的集合 HtmlNode HTML节点,包括注释,文本,元素 HtmlNodeCollection 一个HtmlNode节点集合 HtmlNodeType 一个枚举表示节点的类型,文档,注释,元素,文本。 HtmlTextNode 对应Html文本节点,很简单的一个类,继承自HtmlNode。 HtmlEntity 实用程序类以替换特殊字符的实体 HtmlParseError 表示文档在解析过程中发现的解析错误。 一个例子 HtmlWeb webClient = new HtmlWeb();
//初始化文档
HtmlDocument doc = webClient.Load("http://www.cnblogs.com/");
HtmlNodeCollection titleNodes = doc.DocumentNode.SelectNodes("//a[@class='post-item-title']");
if (titleNodes != null)
{
foreach (var item in titleNodes)
{
Console.WriteLine(item.InnerText);
}
}
/// <summary>
/// 通过class取得数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGetBlogTItle_Click(object sender, EventArgs e)
{
lsvMain.Clear();
lsvMain.Columns.Add("标题");
lsvMain.Columns.Add("链接");
HtmlWeb webClient = new HtmlWeb();
//初始化文档
HtmlAgilityPack.HtmlDocument doc = webClient.Load("http://www.cnblogs.com/");
HtmlNodeCollection titleNodes = doc.DocumentNode.SelectNodes("//a[@class='post-item-title']");
if (titleNodes != null)
{
foreach (var item in titleNodes)
{
ListViewItem it = new ListViewItem();
it.Text = item.InnerText.ToString();
it.SubItems.Add(item.GetAttributeValue("href",""));
lsvMain.Items.Add(it);
}
}
}
private void btnGetByID_Click(object sender, EventArgs e)
{
HtmlWeb webClient = new HtmlWeb();
//初始化文档
HtmlAgilityPack.HtmlDocument doc = webClient.Load("https://www.cnblogs.com/soloversion/p/16100590.html");
//通过Id取得值
HtmlNode titleNode1 = doc.DocumentNode.SelectSingleNode("//a[@id='cb_post_title_url']");
MessageBox.Show(titleNode1.InnerText);
string href = doc.DocumentNode.SelectSingleNode("//a[@id='lnkBlogLogo']").GetAttributeValue("href","");
MessageBox.Show(href);
}
private void btnRemoveHtml_Click(object sender, EventArgs e)
{
HtmlWeb webClient = new HtmlWeb();
//初始化文档
HtmlAgilityPack.HtmlDocument doc = webClient.Load("https://www.cnblogs.com/soloversion/p/16100590.html");
string postBody = "";
HtmlNode newnode = doc.DocumentNode.SelectSingleNode("//div[@class='postBody']");
HtmlNode node2 = newnode.SelectSingleNode("div");
HtmlNode node3 = HtmlNode.CreateNode("<b>Hello</b>");
//在后面插入一个节点
newnode.InsertAfter(node3, node2);
newnode.RemoveChild(node3);
}
private void btnGetChild_Click(object sender, EventArgs e)
{
lsvMain.Clear();
lsvMain.Columns.Add("标签");
lsvMain.Columns.Add("内容");
HtmlWeb webClient = new HtmlWeb();
//初始化文档
HtmlAgilityPack.HtmlDocument doc = webClient.Load("https://www.cnblogs.com/soloversion/p/16100590.html");
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='postBody']");
IEnumerable<HtmlNode> nodeList4 = node.Descendants(); //获取所有的子节点集合
foreach (HtmlNode item in nodeList4)
{
ListViewItem it = new ListViewItem();
it.Text = item.Name.ToString();
it.SubItems.Add(item.InnerText.ToString());
lsvMain.Items.Add(it);
}
}