Comment analyser un formulaire de WebResponse dans un corps POST d'un WebRequest

c# html-agility-pack webrequest webresponse web-scraping

Question

Je suis novice dans ce domaine, c’est mon voyage vierge. Il s’agit de créer une transaction en C # permettant de naviguer dans le flux de pages d’une application Web via WebRequest / WebResponse. Le mécanisme de demande / réponse fonctionne, les cookies et tout (je peux exécuter avec succès une transaction avec des valeurs codées en dur pour les URL POST et les corps POST). La difficulté est de générer un corps POST dynamique et une URL POST pour WebRequest à partir des paires de valeur de WebRequest. . Une fois le flux démarré avec le premier WebRequest, qui a toujours les mêmes URL statique et corps "codé en dur", chaque requête suivante est construite à partir des paires de valeurs FORM de la réponse précédente, par exemple: une partie du FORM figurant dans la réponse. (J'ai remplacé les crochets HTML d'ouverture et de fermeture par des crochets carrés, je ne sais pas comment coller du HTML directement ici):

    <form id="expressform" method="post" action="">
<div>
    <input type="hidden" name="ScreenData.widgets.modified" value=""/><input type="hidden" name="ScreenData.header.hidden.name" value="ScreenData.widgets.modified"/><input type="hidden" name="ScreenData.marshalled" value="true"/><input type="hidden" name="ScreenData.header.hidden.name" value="ScreenData.marshalled"/><input type="hidden" name="isCreateAccountWizard" value="true"/><input type="hidden" name="ScreenData.header.hidden.name" value="isCreateAccountWizard"/>
    <input type="hidden" name="versionPoint" value="77777"/>

puis quelques zones de texte dans le formulaire pour soumettre des valeurs, comme ceci:

<tr>
    <td class="dataOut" style="padding-left:30px">
        <textarea name="ScreenData.sicInfo.natureOfBusiness" rows="5"  cols="60" class="dataOut" onmouseup="textAreaCounter(this,250);;" onkeypress="textAreaCounter(this,250);;" onkeyup="textAreaCounter(this,250);;" onchange="markDataDirty(this);;"></textarea> 
    </td>
</tr>

puis sur Submit, il y a l'URL:

 <a class="detailBtnOn" href="javascript:submitForm('express?displayAction=CreateAccountWizard&amp;saveAction=SaveCreateSICCode&amp;flow=forward&amp;saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&amp;flowToken=CF3827F4-1DE7-54B1-D87B-D72F01C454C3')">Submit</a>

Et ensuite, le prochain WebResponse devrait avoir ceci dans son corps POST:

ScreenData.widgets.modified=&ScreenData.header.hidden.name=ScreenData.widgets.modified&ScreenData.marshalled=true&ScreenData.header.hidden.name=ScreenData.marshalled&isCreateAccountWizard=true&ScreenData.header.hidden.name=isCreateAccountWizard&versionPoint=77777&ScreenData.commonHeaderInfo.accountName=SomeAccountName&ScreenData.commonHeaderInfo.effectiveDate=08%2F01%2F2011&ScreenData.sicInfo.natureOfBusiness=business&ScreenData.sicInfo.sic=7777&ScreenData.widgets.modified=ScreenData.sicInfo.natureOfBusiness&ScreenData.widgets.modified=ScreenData.sicInfo.sic

et ceci comme une URL:

express?displayAction=CreateAccountWizard&saveAction=SaveCreateSICCode&flow=forward&saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&flowToken=CF3827F4-1DE7-54B1-D87B-D72F01C454C3 

Mais non seulement je n'arrive pas à comprendre comment construire ce moteur d'analyse, je ne peux même pas récupérer les paires de valeurs du formulaire. J'essaie d'utiliser AgilityPack, voici un exemple qui devrait au moins imprimer le contenu "important" des formulaires:

var page = new HtmlDocument();
page.OptionReadEncoding = false;
var stream = HttpWResponse.GetResponseStream(); 
page.Load(stream);
foreach (var f in page.DocumentNode.Descendants("form"))
{
    foreach (var d in page.DocumentNode.Descendants("div"))
    {
        Loggers.EventsLogger.Info("");
        Loggers.EventsLogger.Info((f.GetAttributeValue("name", null) ?? f.GetAttributeValue("id", "<no name>")) + ": ");
        Loggers.EventsLogger.Info("");
        Loggers.EventsLogger.Info(f.GetAttributeValue("method", "<no method>") + ' ');
        Loggers.EventsLogger.Info("");
        Loggers.EventsLogger.Info(f.GetAttributeValue("action", "<no action>"));

        foreach(var i in f.Descendants("input"))//{

        {
            Loggers.EventsLogger.Info("");
            Loggers.EventsLogger.Info('\t' + (i.GetAttributeValue("name", null) ?? f.GetAttributeValue("id", "<no name>")));
            Loggers.EventsLogger.Info("");
            Loggers.EventsLogger.Info(" (");
            Loggers.EventsLogger.Info("");
            Loggers.EventsLogger.Info(i.GetAttributeValue("type", "<no type>"));
            Loggers.EventsLogger.Info("");
            Loggers.EventsLogger.Info("): " + i.GetAttributeValue("value", "<no value>"));
        }
        Loggers.EventsLogger.Info("");
        Loggers.EventsLogger.Info("");
    }
}

mais cela n'imprime que ceci:

INFO  EventsLogger - 
INFO  EventsLogger - expressform: 
INFO  EventsLogger - 
INFO  EventsLogger - post 

(si je me débarrasse du bit "div" - foreach (var d dans page.DocumentNode.Descendants ("div")), - rien ne change)


Toute aide ou suggestion sur ce qui se passe avec l’analyseur d’impression FORM et sur la manière de créer un moteur d’analyse permettant de générer des demandes à partir de réponses serait grandement appréciée.

Réponse populaire

Consultez cette page d' analyse syntaxique avec HtmlAgilityPack et ceci http://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.html et http://htmlagilitypack.codeplex.com/discussions/ 247206 et comment pourrais-je obtenir les entrées d'un certain formulaire avec HtmlAgility Pack? Lang: C # .net

EDIT - plus d'infos:

vous passez en boucle foreach sur les formulaires du document HTML, mais vous passez après les DIV dans le prochain foreach sans faire référence au formulaire actuel ... dans la ou les boucles foreach intérieures, vous avez besoin de quelque chose de similaire à

foreach (var d in f.SelectNodes(".//div"))

et

foreach (var i in d.SelectNodes(".//input"))



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