【问题标题】:GetElementsByTagName in HtmlagilitypackHtmlagilitypack 中的 GetElementsByTagName
【发布时间】:2012-04-21 15:19:56
【问题描述】:

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

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

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

但我不知道文本框的 ID,并且在 Webbrowser 控件中可用的 HtmlagilityPack 中找不到 GetElementsByTagName 方法。 在网络浏览器控件中,我可以简单地编写:

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”,但我该怎么做呢?

【问题讨论】:

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


【解决方案1】:

如果您正在通过标签名称查找标签(例如 form 对应 &lt;form name="someForm"&gt;),那么您可以使用:

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

如果您正在通过名称属性查找标签(例如 someForm 对应 &lt;form name="someForm"&gt;,那么您可以使用:

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

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

【讨论】:

    【解决方案2】:

    我认为您正在寻找类似的东西

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

    【讨论】:

    • 不需要 n.Attributes 检查等等。有一个 Name 属性。你可以使用.Where(n =&gt; n.Name == TheNameYoureLookingFor);
    • @jessehouwing 在我准备答案时,OP 没有编辑问题并且属性未知。
    • @jessehouwing 不,我不会想太多,因为只有几行 html OP 显示了。我只是指路,并不想写OP的完整代码。
    • 我更喜欢给出完整而简洁的答案,以免不得不回答 10 个新问题。
    • @jessehouwing 我不能说我对你如何回答问题很感兴趣。如果您有比写答案更好的说法。这是我的方式。
    【解决方案3】:

    任何节点的名称:

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

    按名称输入节点:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2011-02-20
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多