Javascript HtmlAgilityPack.HtmlDocument Cookies

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

这与脚本内(可能在脚本标记内)设置的cookie有关

System.Windows.Forms.HtmlDocument
执行这些脚本,可以通过cookies属性检索cookies集(如
document.cookie=etc.

我假设
HtmlAgilityPack.HtmlDocument
不执行此操作(执行)。我想知道是否有一种简单的方法来模拟
System.Windows.Forms.HtmlDocument
功能(cookies部分)

有人吗?

当我需要同时使用Cookies和HtmlAgilityPack,或者只是创建自定义请求(例如,设置
用户代理
属性等)时,我会这样做:

  • 创建一个封装请求/响应的类。让我们调用这个类
    WebQuery
  • 在该类中有一个私有的CookieCollection(在您的例子中是public)属性
  • 在类内创建一个手动执行请求的方法。签名可以是:

在这个方法中我们需要做什么?

好的,使用HttpWebRequest和HttpWebResponse,手动生成http请求(在Internet上有几个这样做的示例),使用接收流的构造函数创建
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");
...