C# HtmlAlityPack中的GetElementsByTagName
如果我不知道文本框的id,如何为其选择元素 如果我知道它的id,那么我可以简单地写:C# HtmlAlityPack中的GetElementsByTagName,c#,webbrowser-control,html-agility-pack,getelementsbytagname,C#,Webbrowser Control,Html Agility Pack,Getelementsbytagname,如果我不知道文本框的id,如何为其选择元素 如果我知道它的id,那么我可以简单地写: HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id); 但我不知道textbox的ID,在webbrowser控件中的HtmlagilityPack中找不到GetElementsByTagName方法。 在web浏览器控件中,我可以简单地编写: HtmlElementCollection elements = browser[i].Document.Ge
HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id);
但我不知道textbox的ID,在webbrowser控件中的HtmlagilityPack中找不到GetElementsByTagName方法。
在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”,但我该怎么做呢?我想你正在寻找类似的东西
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();
如果要按标记名查找标记(如
的窗体),则可以使用:
var forms = document.DocumentNode.Descendants("form");
var forms = document.DocumentNode.Descendants().Where(node => node.Name == "formName");
如果您正在按标记的名称属性查找标记(例如
的someForm
),则可以使用:
var forms = document.DocumentNode.Descendants("form");
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);
}
}
将为您提供页面上表单标记中的所有输入
var nodes = doc.DocumentNode.SelectNodes("//form[1]//input");
将按名称为您提供页面上第一个表单的所有输入:
doc.DocumentNode.SelectNodes("//*[@name='name']")
按名称输入节点:
doc.DocumentNode.SelectNodes("//input[@name='name']")
嗯,html是什么样子的?可能还有另一种方法。@SHAREK我已经编辑了我的问题,请看一看。看不需要n.Attributes检查和所有检查。有一个Name属性。您可以使用。其中(n=>n.Name==TheNameYoureLookingFor)
@jessehouwing当我准备答案时,OP没有编辑问题,属性未知。@jessehouwing不,我不会想太多,因为只有几行html OP显示了。我只是展示了方法,不想写OP的完整代码。我宁愿给出完整简洁的答案,以避免回答10个新问题问题。@jessehouwing我不能说我对你如何回答这些问题很感兴趣。如果你有更好的话要说而不是写作为答案。这是我的方式。