WebResponse에서 WebRequest의 POST 본문으로 FORM을 구문 분석하는 방법

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

문제

저는 이것에 익숙하지 않습니다. 이것은 처녀 항해이며, WebRequest / WebResponse를 통해 웹 응용 프로그램의 페이지 흐름을 탐색하는 C #으로 트랜잭션을 만드는 것입니다. 요청 / 응답 메커니즘, 쿠키 및 모든 (POST URL 및 POST 본문에 대한 하드 코드 된 값을 사용하여 트랜잭션을 성공적으로 실행할 수 있음), WebRequest의 값 쌍에서 WebRequest에 대한 동적 POST 본문 및 POST URL을 생성하는 데 어려움이 있습니다. . 본질적으로 흐름이 항상 동일한 정적 URL과 "하드 코드 된"본문이있는 첫 번째 WebRequest로 시작되면 다음의 각 Request는 이전 응답의 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>

그런 다음 제출시 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
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow