Javascript HtmlAgilityPack.HtmlDocument Cookies
这与脚本内(可能在脚本标记内)设置的cookie有关Javascript HtmlAgilityPack.HtmlDocument Cookies,javascript,cookies,html-agility-pack,dom,Javascript,Cookies,Html Agility Pack,Dom,这与脚本内(可能在脚本标记内)设置的cookie有关 System.Windows.Forms.HtmlDocument执行这些脚本,可以通过cookies属性检索cookies集(如document.cookie=etc.) 我假设HtmlAgilityPack.HtmlDocument不执行此操作(执行)。我想知道是否有一种简单的方法来模拟System.Windows.Forms.HtmlDocument功能(cookies部分) 有人吗?当我需要同时使用Cookies和HtmlAgilit
System.Windows.Forms.HtmlDocument
执行这些脚本,可以通过cookies属性检索cookies集(如document.cookie=etc.
)
我假设HtmlAgilityPack.HtmlDocument
不执行此操作(执行)。我想知道是否有一种简单的方法来模拟System.Windows.Forms.HtmlDocument
功能(cookies部分)
有人吗?当我需要同时使用Cookies和HtmlAgilityPack,或者只是创建自定义请求(例如,设置用户代理
属性等)时,我会这样做:
- 创建一个封装请求/响应的类。让我们调用这个类
WebQuery
- 在该类中有一个私有的CookieCollection(在您的例子中是public)属性
- 在类内创建一个手动执行请求的方法。签名可以是:
HtmlDocument
类的实例
我们必须使用什么流?那么,返回的流是:
httpResponse.GetResponseStream();
如果使用HttpWebRequest进行查询,则可以轻松地将其CookieContainer
属性设置为每次访问新页面之前声明的变量,这样,您访问的站点设置的所有cookie将正确存储在您在WebQuery
类中声明的CookieContainer
变量中,考虑到您只使用了WebQuery
类的一个实例
希望这个解释对你有用。考虑到使用它,你可以做任何你想做的事情,不管HtmlAgilityPack是否支持它。我还与Rohit Agarwal的类和HtmlAgilityPack一起工作过。 但对我来说,后续的“Get函数”调用不起作用,因为每次都设置了新的cookie。 这就是为什么我自己添加了一些函数。(我的解决方案远非十全十美——这只是一个快速而肮脏的解决方案)但对我来说,它奏效了,如果你不想花很多时间在课堂调查上,我就是这么做的: 添加/修改的功能如下:
class BrowserSession{
private bool _isPost;
private HtmlDocument _htmlDoc;
public CookieContainer cookiePot; //<- This is the new CookieContainer
...
public string Get2(string url)
{
HtmlWeb web = new HtmlWeb();
web.UseCookies = true;
web.PreRequest = new HtmlWeb.PreRequestHandler(OnPreRequest2);
web.PostResponse = new HtmlWeb.PostResponseHandler(OnAfterResponse2);
HtmlDocument doc = web.Load(url);
return doc.DocumentNode.InnerHtml;
}
public bool OnPreRequest2(HttpWebRequest request)
{
request.CookieContainer = cookiePot;
return true;
}
protected void OnAfterResponse2(HttpWebRequest request, HttpWebResponse response)
{
//do nothing
}
private void SaveCookiesFrom(HttpWebResponse response)
{
if ((response.Cookies.Count > 0))
{
if (Cookies == null)
{
Cookies = new CookieCollection();
}
Cookies.Add(response.Cookies);
cookiePot.Add(Cookies); //-> add the Cookies to the cookiePot
}
}
所有后续通话应使用:
response = b.Get2("http://www.blablubb/secondpageyouwannabrowseto");
response = b.Get2("http://www.blablubb/thirdpageyouwannabrowseto");
...
我希望它能帮助你解决同样的问题。使用HtmlAgilityPack.HtmlDocumentPS
public-CookieContainer-cookiePot代码>需要公共CookieContainer cookiePot=新CookieContainer代码>
//initial "Login-procedure"
BrowserSession b = new BrowserSession();
b.Get("http://www.blablubb/login.php");
b.FormElements["username"] = "yourusername";
b.FormElements["password"] = "yourpass";
string response = b.Post("http://www.blablubb/login.php");
response = b.Get2("http://www.blablubb/secondpageyouwannabrowseto");
response = b.Get2("http://www.blablubb/thirdpageyouwannabrowseto");
...