對於初學者來說,你不能使用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,
};