Html Agility Pack解析html小结

  这两天用到了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字符串加载,这个用的比较多的 

//从字符串加载
HtmlDocument doc = new HtmlDocument();
string html = "<div id="wapper"><h1>Hello World!</h1><p>article content</p></div>";
doc.LoadHtml(html);

 

第二步,解析html

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

   HtmlNode   表示一个节点

   HtmlNodeCollection   表示一个节点集合

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

   HtmlAttribute  表示节点属性

 

    string htmlstr="<div id=\"wapper\"><><p id=\"pid\">article content...</p><p>article content...article content...</p></div>"
    HtmlDocument parser = new HtmlDocument();
    parser.LoadHtml(htmlstr);
    //使用xpath表达式查找所有P标签
    HtmlNodeCollection nodes = parser.DocumentNode.SelectNodes("//p");
 
    foreach (HtmlNode tmpNode in nodes)
     {
         if (tmpNode.Attributes["pid= null)
         {
 
              //取节点属性ID的值
              string pid = tmpNode.Attributes["pid"].value;
              string text = tmpNode.InnerText;
              
              //创建一个新节点
              HtmlNode newNode = HtmlNode.CreateNode("<font size=" + size + ">" + text + "</font>");
              //替换子节点 
              tmpNode.ParentNode.ReplaceChild(newNode, tmpNode);
          }
         else
         {
              HtmlNode rvNode = tmpNode.ParentNode.RemoveChild(tmpNode, true);  //删除标签,但保留标签内文本
         }
      }
                


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

 HtmlNode类的属性

Attributes             获取节点的属性集合
ChildNodes           获取子节点集合(包括文本节点)
Closed             该节点是否已关闭(</xxx>)
ClosingAttributes          在关闭标签的属性集合
FirstChild            获取第一个子节点
HasAttributes           判断该节点是否含有属性
HasChildNodes         判断该节点是否含有子节点
HasClosingAttributes         判断该节点的关闭标签是否含有属性(</xxx class="xxx">)
Id                  获取该节点的Id属性
InnerHtml            获取该节点的Html代码
InnerText              获取该节点的内容,与InnerHtml不同的地方在于它会过滤掉Html代码,而InnerHtml是连Html代码一起输出
LastChild             获取最后一个子节点
Line                获取该节点的开始标签或开始代码位于整个HTML源代码的第几行(行号)
LinePosition           获取该节点位于第几列
Name              Html元素名
NextSibling                 获取下一个兄弟节点
NodeType             获取该节点的节点类型
OriginalName          获取原始的未经更改的元素名
OuterHtml              整个节点的代码
OwnerDocument           节点所在的HtmlDocument文档
ParentNode           获取该节点的父节点
PreviousSibling         获取前一个兄弟节点
StreamPosition         该节点位于整个Html文档的字符位置
XPath               根据节点返回该节点的XPath

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);

发布了34 篇原创文章 · 获赞 6 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章