Extraire des données d'un formulaire HTML à l'aide du pack HTML Agility

c# html html-agility-pack winforms

Question

J'essaie de répertorier tous les nœuds du formulaire HTML que j'ai de manière dynamique à l'aide du pack d'agilité HTML, ce qui signifie que je ne connais pas les noms des attributs ni les noms des entrées. Le problème est quand je veux obtenir l'étiquette correspondant à l'entrée.

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

Donc ici, je veux écrire Username puis l'entrée, cela semble très évident dans cet exemple, mais parfois ce ne sont pas des frères et sœurs directs, il y aurait beaucoup d'entrées cachées, ou d'autres balises.

Un autre exemple:

   <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>

J'utilise des winforms C # dans mon projet.

J'ai peu d'idées, mais elles prendront beaucoup de temps, alors je me suis dit que depuis que je suis nouveau au pack d'agilité HTML, il y aurait un moyen ou un raccourci pour l'obtenir ", des suggestions?

Réponse populaire

Quelque chose comme ça devrait marcher.

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

Ensuite, pour l’utiliser, indiquez simplement le nom des champs pour lesquels vous souhaitez obtenir les éléments d’entrée.

GetInputNodes(doc, "username");

Juste un avertissement, il semble que HtmlAgilityPack ne ferme pas le formulaire comme il le devrait probablement. Vous devrez donc spécifier que les éléments de formulaire doivent être fermés avant de charger le code HTML. Sans cela, HAP ne reconnaîtra pas que le formulaire possède des nœuds enfants.

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi