web-dev-qa-db-ja.com

HtmlagilitypackのGetElementsByTagName

たとえば、要素を選択するにはどうすればよいですか。 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」だけで、この名前だけを使用してこの要素を取得したいと思います。したがって、すべてのフォームを1つずつ解析して、この名前「sometext」を見つける必要があると思いますが、どうすればよいですか?

15
Ali

TagName(<form name="someForm">formなど)でタグを探している場合は、次を使用できます。

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

名前プロパティ(<form name="someForm">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");

ページの最初のフォームのすべての入力を提供します

32
jessehouwing

名前による任意のノード:

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

名前による入力ノード:

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

私はあなたがこのようなものを探していると思います

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();
5
L.B