如何將Web從WebResponse解析為WebRequest的POST主體

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

我是新手,這是我的處女航行,手頭的任務是在C#中創建一個事務,它將通過WebRequest / WebResponse瀏覽Web應用程序的頁面流。我得到了請求/響應機制,cookie和所有(我可以使用POST URL和POST正文的硬編碼值成功執行事務),困難在於從WebRequest的值對生成WebRequest的動態POST正文和POST URL 。本質上,一旦流程開始於第一個WebRequest,它始終具有相同的靜態URL和“硬編碼”主體,則每個後續請求都是根據前一個響應的FORM值對構建的,例如:響應中的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>

然後在提交時有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,這里至少應該打印出FORMs“重要”的內容:

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(在頁面中的var d.DocumentNode.Descendants(“div”)), - 沒有任何改變)


有關FORM打印輸出解析器的內容以及如何構建解析引擎以構建響應請求的任何幫助或建議將不勝感激。

熱門答案

使用HtmlAgilityPackhttp://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.htmlhttp://htmlagilitypack.codeplex.com/discussions/查看解析HTML頁面 247206以及如何使用HtmlAgility Pack獲取某個表單的輸入?郎:C#.net

編輯 - 更多信息:

你通過foreach循環遍歷HTML文檔中的表單但是你在下一個foreach中繼續使用DIV而不引用當前表單...在內部foreach循環中你需要類似於

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

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


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因