Htmlagilitypack中的GetElementsByTagName

时间:2012-04-21 15:19:56

标签: c# webbrowser-control html-agility-pack getelementsbytagname

如何为例如选择元素文本框,如果我不知道它的ID?

如果我知道它的id,那么我可以简单地写一下:

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

但是我不知道textbox的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”但是我该怎么做?

3 个答案:

答案 0 :(得分:29)

如果您正在通过其tagName查找标记(例如form的{​​{1}}),那么您可以使用:

<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); } } 和XPath查询文档:

SelectNodes

会在页面上为您提供表单标记中的所有输入。

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

将为您提供页面上第一个表单的所有输入

答案 1 :(得分:6)

任何名称的节点:

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

按名称输入节点:

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

答案 2 :(得分: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();