2012-03-08 64 views
0

這裏的所有值是我到目前爲止有:使用HTMLAgilityPack獲得選擇元素

  HtmlAgilityPack.HtmlDocument ht = new HtmlAgilityPack.HtmlDocument(); 


     TextReader reader = File.OpenText(@"C:\Users\TheGateKeeper\Desktop\New folder\html.txt"); 
     ht.Load(reader); 

     reader.Close(); 

     HtmlNode select= ht.GetElementbyId("cats[]"); 


     List<HtmlNode> options = new List<HtmlNode>(); 

     foreach (HtmlNode option in select.ChildNodes) 
     { 
      if (option.Name == "option") 
      { 
       options.Add(option); 
      } 
     } 

現在我的所有的「選項」選擇元素的列表。我需要訪問哪些屬性才能獲取密鑰和文本?

所以,如果例如,對於一個選項的HTML是:

<option class="level-1" value="1">Funky Town</option> 

我想作爲輸出:

1 - Funky Town 

感謝

編輯:我剛剛發現了一些。當我得到「Select」元素的子元素時,它返回「option」類型的元素和「#text」類型的元素。

嗯.. #text有我想要的字符串,但select有值。

我買了HTMLAgilityPack是一個html解析器?爲什麼它會給我這樣的混淆值?

+0

你可以發佈源文件中的一些html嗎? – lincolnk 2012-03-08 19:42:10

回答

2

這是由於html解析器的默認配置;它已將<option>配置爲HtmlElementFlag.Empty(使用「它們有時包含的註釋,有時它們不包含......」)。 <form>標記具有相同的設置(CanOverlap + Empty),這會導致它們在dom中顯示爲空節點,而沒有任何子節點。

您需要在解析文檔之前刪除該標誌。

HtmlNode.ElementsFlags.Remove("option"); 

請注意,ElementsFlags屬性是靜態的,任何更改都會影響所有進一步的解析。

+0

上帝保佑你! – TheGateKeeper 2012-03-08 20:03:31

0

編輯:你應該直接通過XPath選擇option節點。我認爲這應該是這樣的:

var options = select.SelectNodes("option"); 

這將得到您的選項沒有文本節點。選項應該包含你想要的地方的字符串。等待你的html樣本。

foreach (var option in options) 
{ 
    int value = int.Parse(option.Attributes["value"].Value); 
    string text = option.InnerText; 

}


你可以添加一些健全檢查的屬性,以確保它的存在。

+0

這就是我所做的,但每個項目的innerText是「」。 – TheGateKeeper 2012-03-08 19:35:30

+0

嗯,我使用InnerText,它適用於我。也許看看'option.FirstChild',看看是否存在/包含你的價值。 – lincolnk 2012-03-08 19:37:34

+0

看問題,更新。 – TheGateKeeper 2012-03-08 19:40:15