GetElementsByTagName in Htmlagilitypack

c# getelementsbytagname html-agility-pack webbrowser-control

Frage

Wie wähle ich ein Element für zB Textbox, wenn ich seine ID nicht kenne?

Wenn ich seine ID kenne, kann ich einfach schreiben:

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

Aber ich kenne die ID der Textbox nicht und ich kann die Methode GetElementsByTagName in HtmlagilityPack nicht finden, die in der Webbrowsersteuerung verfügbar ist. In der Webbrowser-Kontrolle hätte ich einfach schreiben können:

HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form");
foreach (HtmlElement currentElement in elements)
{

}

BEARBEITEN

Hier ist das HTML-Formular, über das ich spreche

<form id="searchform" method="get" action="/test.php">
<input name="sometext" type="text">
</form>

Bitte beachten Sie, dass ich die ID des Formulars nicht kenne. Und es kann mehrere Formulare auf derselben Seite geben. Das einzige, was ich weiß, ist "sometext" und ich möchte dieses Element nur mit diesem Namen erhalten. Ich denke, ich werde alle Formen einzeln analysieren müssen und dann diesen Namen als "etwas" finden, aber wie mache ich das?

Akzeptierte Antwort

Wenn Sie nach dem Tag anhand seines tagName suchen (z. B. form für <form name="someForm"> ), können Sie <form name="someForm"> verwenden:

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

Wenn Sie nach der Eigenschaft name des Tags suchen (z. B. someForm für <form name="someForm"> , können Sie <form name="someForm"> verwenden:

var forms = document.DocumentNode.Descendants().Where(node => node.Name == "formName");

Für die letzte können Sie eine einfache Erweiterungsmethode erstellen:

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

Hinweis: Sie können SelectNodes und XPath auch verwenden, um Ihr Dokument abzufragen:

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

Würde Ihnen alle Eingaben auf der Seite geben, die sich in einem Formular-Tag befinden.

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

Würde Ihnen alle Eingaben des ersten Formulars auf der Seite geben


Beliebte Antwort

Jeder Knoten nach Namen:

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

Eingabeknoten nach Name:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum