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']")