WebResponseからWebRequestのPOST本体にFORMを解析する方法

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

質問

私はこれで初めてです。これは私の処女航海です.Cart#でWebRequest / WebResponse経由でWebアプリケーションのページフローをナビゲートするトランザクションを作成することです。リクエスト/レスポンスメカニズム、クッキー、すべて(POST URLとPOSTボディのハードコードされた値でトランザクションを正常に実行できます)が得られますが、WebRequestの値ペアからWebRequestの動的POSTボディとPOST URLを生成するのは難しい。基本的には、フローが常に同じ静的URLと「ハードコードされた」本文を持つ最初のWebRequestで開始されると、それに続く各Requestは前のResponseのFORM値のペアから構築されます。たとえば、ResponseにあるFORMの部分(ここでは、HTMLの開閉記号を角括弧で置き換えていますが、HTMLをここに直接貼り付ける方法はわかりません):

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

次のように値を送信するフォームのテキスト領域を次に示します。

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

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

そして次のWebResponseは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

これをURLとします:

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

しかし、私はこの構文解析エンジンを構築する方法を理解できないだけでなく、FORMから値ペアを取得することさえできません。私はAgilityPackを使用しようとしていますが、ここでは少なくとも重要な "FORM"コンテンツを印刷する必要があります。

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

しかし、これだけが表示されます:

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

(もし私が "div"ビットを取り除くならば、foreach(page.DocumentNode.Descendants( "div")のvar d)、何も変わらない)


FORMプリントアウトパーサで何が起こっているのか、そしてレスポンスからリクエストを作成するための構文解析エンジンを構築する方法についての助言や提案は非常に高く評価されます。

人気のある回答

これをチェックアウトするHtmlAgilityPackとこのhttp://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.htmlhttp://htmlagilitypack.codeplex.com/discussions/で HTMLページを解析する 247206HtmlAgility Packで特定のフォームからの入力どのように取得できますか? Lang:C#.net

編集 - いくつかの詳細情報:

あなたはHTML文書のフォームをforeach経由でループしますが、現在のフォームを参照せずに次のforeachでDIVを実行します。内側のforeachループでは、次のようなものが必要です

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

そして

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


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ