9

如何選擇一個元素用於例如文本框,如果我不知道它的ID?GetTelementsByTagName in Htmlagilitypack

如果我知道這個ID,然後我可以簡單的寫:

HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id); 

但我不知道文本框的ID,我無法找到HtmlagilityPack的getElementsByTagName方法,它是在WebBrowser控件可用。 在Web瀏覽器控制,我可以簡單地寫:

HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form"); 
foreach (HtmlElement currentElement in elements) 
{ 

} 

編輯

這是我講的HTML表單有關

<form id="searchform" method="get" action="/test.php"> 
<input name="sometext" type="text"> 
</form> 

請注意,我不知道該ID的形式。在同一頁面上可以有多種形式。我唯一知道的是「sometext」,我想用這個名字得到這個元素。所以我想我將不得不逐一解析所有形式,然後找到這個名字「sometext」,但我該怎麼做?

+0

好,什麼該html的樣子?可能有另一種方法。 – shriek 2012-04-21 15:32:40

+0

@shriek 我編輯了我的問題請看看。 – Ali 2012-04-21 15:43:48

+0

請參閱http://stackoverflow.com/a/3120867/68607 – TFD 2012-09-06 21:45:24

回答

26

如果你正在尋找它的標記名的標籤(如form<form name="someForm">),那麼你可以使用:

var forms = document.DocumentNode.Descendants("form"); 

如果您正在尋找標籤的名稱屬性(例如someForm<form name="someForm">,那麼您可以使用:

var forms = document.DocumentNode.Descendants().Where(node => node.Name == "formName"); 

對於最後一個,你可以創建一個簡單的擴展方法:

public static class HtmlNodeExtensions 
{ 
    public static IEnumerable<HtmlNode> GetElementsByName(this HtmlNode parent, string name) 
    { 
     return parent.Descendants().Where(node => node.Name == name); 
    } 

    public static IEnumerable<HtmlNode> GetElementsByTagName(this HtmlNode parent, string name) 
    { 
     return parent.Descendants(name); 
    } 
} 

注意:您也可以使用SelectNodes和XPath查詢您的文檔:

var nodes = doc.DocumentNode.SelectNodes("//form//input"); 

會在給你所有的投入表單標籤中的頁面。按名稱

doc.DocumentNode.SelectNodes("//*[@name='name']") 

輸入節點:

var nodes = doc.DocumentNode.SelectNodes("//form[1]//input"); 

會給你的第一種形式的所有輸入的頁面

5

我認爲你正在尋找這樣的事情

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml("...."); 

var inputs = doc.DocumentNode.Descendants("input") 
    .Where(n => n.Attributes["name"]!=null && n.Attributes["name"].Value == "sometext") 
    .ToArray(); 
+0

我編輯了我的問題請看看。 – Ali 2012-04-21 15:46:11

+0

@Ali我更新了答案已經 – 2012-04-21 15:48:50

+0

不需要n.Attributes檢查和所有。有一個Name屬性。你可以使用'.Where(n => n.Name == TheNameYoureLookingFor);' – jessehouwing 2012-04-21 17:54:49

5

任何節點上的名字

doc.DocumentNode.SelectNodes("//input[@name='name']")