Extrahieren Sie Daten aus einem HTML-Formular mit dem HTML Agility-Paket

c# html html-agility-pack winforms

Frage

Ich versuche, alle Knoten in dem HTML-Formular, das ich dynamisch verwende, mit HTML agility pack aufzulisten, was bedeutet, dass ich die Namen der Attribute und der Eingabe-Namen nicht kenne. Das Problem ist, wenn ich das Etikett erhalten möchte, das der Eingabe entspricht.

<form name="input" action="html_form_action.asp" method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>

Also hier möchte ich Username dann die Eingabe schreiben, es scheint wirklich offensichtlich in diesem Beispiel, aber manchmal sind sie nicht direkte Geschwister, es würde viele versteckte Eingaben oder andere Tags geben.

Ein anderes Beispiel:

   <input type=hidden name="startDate">

      <TR>  <TD bgColor=#008088 colSpan=2 class="headfont">

        <FONT color=#FFFFFF>  <B>* Enter ur username and password</B> </FONT>

      </TD></TR>

      <TR>

       <TD bgColor=#9ccdcd class="datafont"><FONT color=black>Username</FONT></TD>

            <TD bgColor=#9ccdcd class="datafont">

            <INPUT tabIndex=1 name=stuNum 

              autocomplete="off" size="20"></TD></TR>

          <TR>

Verwende C # winforms in meinem Projekt.

Ich habe ein paar Ideen, aber sie werden viel Zeit brauchen, also dachte ich, seit neu zu HTML Agilität Paket gibt es einen Weg oder eine Abkürzung, um es zu bekommen ,,, Irgendwelche Vorschläge?

Beliebte Antwort

So etwas sollte funktionieren.

static IEnumerable<Tuple<string, HtmlNode>> GetInputNodes(HtmlDocument doc, params string[] fields)
{
    var form = doc.DocumentNode.SelectSingleNode("//form");
    foreach (var field in fields)
    {
        var fieldNode = form.ChildNodes
            .OfType<HtmlTextNode>()
            .Where(node => node.Text.Trim().StartsWith(field, StringComparison.OrdinalIgnoreCase))
            .SingleOrDefault();
        if (fieldNode == null)
            continue;

        var input = FindCorrespondingInputNode(fieldNode);
        if (input != null)
            yield return Tuple.Create(field, input);
    }
}

static HtmlNode FindCorrespondingInputNode(HtmlTextNode fieldNode)
{
    for (var currentNode = fieldNode.NextSibling;
         currentNode != null && currentNode.NodeType != HtmlNodeType.Text;
         currentNode = currentNode.NextSibling)
    {
        if (currentNode.Name == "input"
         && !currentNode.Attributes["type"].Value.Contains("hidden"))
        {
            return currentNode;
        }
    }
    return null;
}

Dann geben Sie einfach die Namen der Felder ein, für die Sie die Eingabeelemente erhalten möchten.

GetInputNodes(doc, "username");

Nur eine Warnung, es scheint, dass HtmlAgilityPack das Formular nicht so schließt, wie es wahrscheinlich sollte. Sie müssen also angeben, dass die Formularelemente vor dem Laden des HTML-Dokuments geschlossen werden sollen. Ohne es erkennt HAP nicht, dass das Formular über untergeordnete Knoten verfügt.

var doc = new HtmlDocument();
HtmlNode.ElementsFlags["form"] = HtmlElementFlag.Closed;
doc.Load(url);


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