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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章