星期日, 3月 20, 2011

HtmlAgilityPack C#的一個很方便的html paser

比較詳細的介紹可在這邊看
http://msdn.microsoft.com/zh-tw/ee787055


簡單範例:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(targetHTML);
HtmlNode n = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/table[1]/tr[1]/td[2]/font[1]");
string activity = HtmlEntity.DeEntitize(n.InnerHtml).Trim();
HtmlNode node;
if (key == "sex")
    node = doc.DocumentNode.SelectSingleNode("//input[@name='" + key + "' and @checked]");
else
    node = doc.DocumentNode.SelectSingleNode("//input[@name='" + key + "' ]");
if (node != null) signData.Add(key, node.Attributes["value"].Value);
else if ((signData.ContainsKey("chkmeal") && signData["chkmeal"] == "1") && key == "meal")
{
    if (foodDic.ContainsKey(food))
        signData.Add(key, foodDic[food]);
    else
        signData.Add(key, foodDic["不用餐"]);
}



不過不知道為甚麼..  它用XPath分析出來的的東西跟我想的有點差距
因為這樣我還用了Firefox的xpath checker去看,出來的東西果然不一樣


分享一個我的解決辦法~
先設定中斷點在 SelectNodes 方法* 後,然後直接下需要的XPath的Html tag (EX: //input)
之後在每個 HtmlNode 都會有它的絕對XPath路徑,直接去看那邊吧

* SelectSingleNode 是取單一個tag,傳回HtmlNodeCollection
  SelectNodes 是取多個符合的,傳回HtmlNode

沒有留言:

張貼留言