2016-12-27 87 views
-2

我想獲得所有控件的名稱和控件的類型,如果它是一個文本框或複選框等使用HtmlAgilityPack。我總是看到該值爲空。可能是什麼問題?HtmlAgilityPack獲取頁面控件的名稱和屬性的類型

  HtmlDocument htmlCode = new HtmlDocument(); 
      htmlCode.LoadHtml("http://www.google.com"); 
      //var htmlCode = client.DownloadString("http://www.google.com"); 
      HtmlNode.ElementsFlags.Remove("form"); 

      HtmlNode myForm = htmlCode.GetElementbyId("form"); 

      foreach (HtmlNode node in myForm.Elements("input")) 
      { 
       HtmlAttribute valueAttribute = node.Attributes["value"]; 

       if (valueAttribute != null) 
       { 
        Console.WriteLine(valueAttribute.Value); 
       } 
      } 

回答

1

對於初學者來說,你不能使用HtmlDocument(不直接)URL加載的頁面。無論如何,運行這會給你一個錯誤。您必須單獨下載內容並加載它,或者只需使用HtmlWeb加載它。

修復方法form處理元素的處理方法必須先設置之前您解析文檔。否則,更改將不起作用。

您的示例代碼假定有form元素名爲form,並且輸入可能是其直接子元素。封閉表單中的輸入不一定必須是表單的子節點,它可能是樹中任何位置的後代。

如果您只是在尋找所有表單字段,不管表單是什麼,只要查找適當類型的所有後代即可。

string GetControlType(HtmlNode n) 
{ 
    switch (n.Name) 
    { 
    case "button": return n.GetAttributeValue("type", "(submit)"); 
    case "input": return n.GetAttributeValue("type", "(text)"); 
    default:  return null; 
    } 
} 
string GetControlValue(HtmlNode n) 
{ 
    switch (n.Name) 
    { 
    case "button": 
    case "input": 
     return n.GetAttributeValue("value", null); 
    case "select": 
     if (n.Descendants("option").SkipWhile(x => x.Attributes["selected"] == null).FirstOrDefault() is HtmlNode o) return o.GetAttributeValue("value", null); 
     return n.Descendants("option").FirstOrDefault()?.GetAttributeValue("value", null); 
    case "textarea": 
     return n.InnerText; 
    default: return null; 
    } 
} 

HtmlNode.ElementsFlags.Remove("form");  
var doc = new HtmlWeb().Load("http://www.google.com"); 
var fields = new[] { "button", "input", "select", "textarea" }; 
var query = 
    from n in doc.DocumentNode.Descendants() 
    where fields.Contains(n.Name) 
    let controlType = GetControlType(n) 
    let controlValue = GetControlValue(n) 
    select new 
    { 
     ControlName = n.Name, 
     ControlType = controlType, 
     Name = n.GetAttributeValue("name", null), 
     Value = controlValue, 
     OuterHtml = n.OuterHtml, 
    };