GetElementsByTagName in Htmlagilitypack

本文关键字:Htmlagilitypack in GetElementsByTagName | 更新日期: 2023-09-27 18:32:01

如果我不知道它的 id,如何为文本框选择一个元素?

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

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

但是我不知道文本框的ID,并且在Web浏览器控件中可用的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",但我该怎么做呢?

GetElementsByTagName in Htmlagilitypack

如果您通过标签名称查找标签(例如 form 表示 <form name="someForm"> ),则可以使用:

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

如果要按 name 属性(例如 someForm for <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");

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

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

会给你页面上第一个表单的所有输入

我想你正在寻找这样的东西

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();

任何按名称排列的节点:

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

按名称排列的输入节点:

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