Html Agility Pack解析html小结

来源:互联网 发布:手机免费起名软件 编辑:程序博客网 时间:2024/06/04 18:59

这两天用到了Html Agility Pack解析html,这东西官方没有文档,不过网上还是有很多资料的,虽然雷同总比没有好.它的网站是 http://htmlagilitypack.codeplex.com

下载下来是一个dll文件直接在工程里引用就可以了.

 

第一步,加载HTML文件

 加载主是HtmlDocument类的load方法完成,里面提供了多种加载方式,看方法的参数类型就一目了然了,主要分两类从Stream和物理路径path加载

        public void Load(Stream stream);
        public void Load(TextReader reader);
        public void Load(Stream stream, bool detectEncodingFromByteOrderMarks);
        public void Load(Stream stream, Encoding encoding);  //指定了编码格式

        public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks);
        public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize);
        public void Load(string path);        
        public void Load(string path, bool detectEncodingFromByteOrderMarks);
        public void Load(string path, Encoding encoding);      
        public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks);       
        public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize);
        public void LoadHtml(string html);//直接从html字符串加载,这个用的比较多的 

[csharp] view plaincopy
  1. //从字符串加载  
  2. HtmlDocument doc = new HtmlDocument();  
  3. string html = "<div id="wapper"><h1>Hello World!</h1><p>article content</p></div>";  
  4. doc.LoadHtml(html);  

 

第二步,解析html

   首先需要了解几个相关的类和方法 

   HtmlNode   表示一个节点

   HtmlNodeCollection   表示一个节点集合

   DocumentNode   文档根节点,本身也是一个HtmlNode

   HtmlAttribute  表示节点属性

 

[csharp] view plaincopy
  1. string htmlstr="<div id=\"wapper\"><><p id=\"pid\">article content...</p><p>article content...article content...</p></div>"  
  2. HtmlDocument parser = new HtmlDocument();  
  3. parser.LoadHtml(htmlstr);  
  4. //使用xpath表达式查找所有P标签  
  5. HtmlNodeCollection nodes = parser.DocumentNode.SelectNodes("//p");  
  6.   
  7. foreach (HtmlNode tmpNode in nodes)  
  8.  {  
  9.      if (tmpNode.Attributes["pid= null)  
  10.      {  
  11.   
  12.           //取节点属性ID的值  
  13.           string pid = tmpNode.Attributes["pid"].value;  
  14.           string text = tmpNode.InnerText;  
  15.             
  16.           //创建一个新节点  
  17.           HtmlNode newNode = HtmlNode.CreateNode("<font size=" + size + ">" + text + "</font>");  
  18.           //替换子节点   
  19.           tmpNode.ParentNode.ReplaceChild(newNode, tmpNode);  
  20.       }  
  21.      else  
  22.      {  
  23.           HtmlNode rvNode = tmpNode.ParentNode.RemoveChild(tmpNode, true);  //删除标签,但保留标签内文本  
  24.      }  
  25.   }  
  26.               


 这里要注意的是在获取属性值时,如果某一个属性名称不存在的话,Attributes["attriname"]返回的是null值

 HtmlNode类的几个重要属性

  FirstChild,LastChild,ChildNodes,ParentNode 这几个不用多说跟DOM里一样
  public HtmlNodeCollection ChildNodes { get; }
  public virtual string InnerHtml { get; set; }
  public virtual string InnerText { get; }  //注意这个是只读的
  public HtmlNode NextSibling { get; }
  public HtmlNode PreviousSibling { get; }

HtmlNode类的重要方法


 GetElementbyId(string id) 使用元素ID取得该元素

获取父节点的系列方法:

1)public IEnumerable<HtmlNode> Ancestors()

获取当前节点的父节点列表(不包含自身)。

2)public IEnumerable<HtmlNode> Ancestors(string name)

以指定一个名称来获取父节点的列表(不包含自身)。

3)public IEnumerable<HtmlNode> AncestorsAndSelf()

获取当前节点的父节点列表(包含自身)。

4)public IEnumerable<HtmlNode> AncestorsAndSelf(string name)

以指定一个名称来获取父节点的列表(包含自身)。

获取子节点的系列方法:

1)public IEnumerable<HtmlNode> DescendantNodes()

获取当前节点下的所有子节点的列表,包括子节点的子节点(不包含自身)。

2)public IEnumerable<HtmlNode> DescendantNodesAndSelf()

获取当前节点下的所有子节点的列表,包括子节点的子节点(包含自身)。

3)public IEnumerable<HtmlNode> Descendants()

获取当前节点下的直接子节点的列表(不包含自身)。

4)public IEnumerable<HtmlNode> DescendantsAndSelf()

获取当前节点下的直接子节点的列表(包含自身)。

5)public IEnumerable<HtmlNode> Descendants(string name)

获取当前节点下的以指定名称的子节点列表。

6)public IEnumerable<HtmlNode> DescendantsAndSelf(string name)

获取当前节点下的以指定名称的子节点的列表(包含自身)。

7)public HtmlNode Element(string name)

获取第一个符合指定名称的直接子节点的节点元素。

8)public IEnumerable<HtmlNode> Elements(string name)

获取符合指定名称的所有直接子节点的节点列表。

9)public HtmlNodeCollection SelectNodes(string xpath)

获取符合指定的xpath的子节点列表。

10)public HtmlNode SelectSingleNode(string xpath)

获取符合指定的xpath的单个字节点元素。

操作系列方法

public void Remove();
public void RemoveAll();
public void RemoveAllChildren();
public HtmlNode RemoveChild(HtmlNode oldChild);
public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);
public HtmlNode ReplaceChild(HtmlNode newChild, HtmlNode oldChild);
public HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild);
public HtmlNode InsertBefore(HtmlNode newChild, HtmlNode refChild);

HtmlDocument类的重要方法

public HtmlAttribute CreateAttribute(string name);
public HtmlAttribute CreateAttribute(string name, string value);
public HtmlNode CreateElement(string name);
public XPathNavigator CreateNavigator();
public HtmlTextNode CreateTextNode();
public HtmlTextNode CreateTextNode(string text);
public HtmlNode GetElementbyId(string id);

原创粉丝点击