Wie man ein FORM von WebResponse in einen POST-Körper einer WebRequest analysiert

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

Frage

Ich bin neu, das ist meine Jungfernfahrt, die Aufgabe besteht darin, eine Transaktion in C # zu erstellen, die durch WebRequest / WebResponse durch den Seitenfluss einer Web-App navigiert. Ich habe den Request / Response-Mechanismus funktioniert, Cookies und alle (ich kann erfolgreich eine Transaktion mit fest codierten Werten für POST-URLs und POST-Körper ausführen), die Schwierigkeit besteht darin, aus den Wertepaaren von WebRequest dynamischen POST-Body und POST-URL für die WebRequest zu generieren . Nachdem der Flow mit der ersten WebRequest gestartet wurde, die immer dieselbe statische URL und denselben "hardcoded" Body hat, wird jede folgende Anfrage aus den FORM-Wertpaaren der vorherigen Response erstellt, zum Beispiel: Teil der FORM, die in der Response enthalten ist (Ich habe HTML-öffnende und schließende Klammern durch eckige ersetzt, bin mir nicht sicher, wie man HTML direkt hier einfügen kann):

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

und dann einige Textbereiche in der Form, um Werte wie folgt zu übermitteln:

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

und dann auf Submit gibt es die 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>

Und dann sollte die nächste WebResponse das in ihrem POST-Körper haben:

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

und das als URL:

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

Aber nicht nur ich kann nicht herausfinden, wie man diese Parsing-Engine erstellt, ich kann nicht einmal Wertpaare von der FORM greifen. Ich versuche, AgilityPack zu verwenden, hier ist ein bisschen, das zumindest den wichtigen Inhalt von FORMs ausdrucken sollte:

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

aber es druckt das nur aus:

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

(Wenn ich das "div" Bit loswerde - foreach (var d in page.DocumentNode.Descendants ("div")), - ändert sich nichts)


Jede Hilfe oder Vorschläge dazu, was mit dem Ausdruck-Parser von FORM passiert und wie man eine Parsing-Engine zum Erstellen von Anfragen aus Antworten erstellt, wäre sehr zu begrüßen.

Beliebte Antwort

check this out Parsing HTML-Seite mit HtmlAgilityPack und das http://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.html und http://htmlagilitypack.codeplex.com/discussions/ 247206 und Wie bekomme ich die Eingaben von einem bestimmten Formular mit HtmlAgility Pack? Lang: C # .net

BEARBEITEN - weitere Informationen:

Du fährst über foreach über die Formulare im HTML-Dokument, aber du gehst nach den DIVs in der nächsten foreach, ohne auf die aktuelle Form zu verweisen ... in der inneren foreach-Schleife (n) brauchst du etwas Ähnliches

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

und

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



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