I'm using the Html Agility Pack for getting and parsing HTML pages. It offers many possibilities, including XPath selectors.
Today I had a problem with posting data to a webpage. It's possible to call the HtmlWeb
Load
function with a second "POST" parameter, but it offers no easy way to add values to be posted.
After a while of searching I came across this solution: add this two functions to the HtmlWeb
class. (You can get the source in download section, too)
public HtmlDocument SubmitFormValues (NameValueCollection fv, string url)
{
// Attach a temporary delegate to handle attaching
// the post back data
PreRequestHandler handler = delegate
(HttpWebRequest request) {
string payload = this.AssemblePostPayload (fv)
;
byte
[
] buff = Encoding.ASCII.GetBytes (payload.ToCharArray (
)
)
;
request.ContentLength = buff.Length
;
request.ContentType = "application/x-www-form-urlencoded"
;
System.IO
.Stream reqStream = request.GetRequestStream (
)
;
reqStream.Write (buff, 0, buff.Length
)
;
return true;
}
this.PreRequest += handler;
HtmlDocument doc = this.Load (url, "POST"
)
;
this.PreRequest -= handler;
return doc;
}
private string AssemblePostPayload (NameValueCollection fv)
{
StringBuilder sb = new StringBuilder (
)
;
foreach (
String key in fv.AllKeys
) {
sb.Append (
"&" + key + "=" + fv.Get (key)
)
;
}
return sb.ToString (
).Substring (
1
)
;
}
Source: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14255
Now posting is easy. Example:
NameValueCollection postData = new NameValueCollection (
1
)
;
postData.Add (
"name", "value"
)
;
doc = this.hw.SubmitFormValues (postData, url)
;
(hw
is an HtmlWeb
object and doc
an HtmlDocument
object)
If you need to use cookies, too, you need to modify the HtmlWeb
a little more, because there is a little bug.
First add a new private
variable:
private CookieContainer _ck = new CookieContainer(
)
;
Then find this section:
if (_useCookies)
{
req.CookieContainer = new CookieContainer(
)
;
}
And change it into:
if (_useCookies)
{
req.CookieContainer = this._ck;
}
Now you just have to activate the usage of cookies in your HtmlWeb
object:
this.hw = new HtmlWeb (
)
;
this.hw.UseCookies = true;
That's it! Enjoy easy form posting with a full cookie jar (:
댓글 없음:
댓글 쓰기