HtmlAgilityPack.HtmlDocument Cookies

时间:2011-04-06 07:40:17

标签: javascript cookies html-agility-pack dom

这适用于在脚本中设置的cookie(可能在脚本标记内)。

System.Windows.Forms.HtmlDocument执行这些脚本,并且可以通过 Cookies 属性检索设置的Cookie(如document.cookie=etc...)。

我认为HtmlAgilityPack.HtmlDocument没有这样做(执行)。我想知道是否有一种简单的方法可以模拟System.Windows.Forms.HtmlDocument功能(cookies部分)。

任何?

2 个答案:

答案 0 :(得分:3)

当我需要一起使用 Cookies HtmlAgilityPack 时,或者只是创建自定义请求(例如,设置User-Agent属性等)时,这里是我做了什么:

  • 创建一个封装请求/响应的类。我们称这个班为WebQuery
  • 在该类中设置私有 CookieCollection (在您的情况下为 public )属性
  • 在类中创建一个手动执行请求的方法。签名可以是:

...

public HtmlAgilityPack.HtmlDocument GetSource(string url);

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

好吧,使用 HttpWebRequest HttpWebResponse ,手动生成http请求(有几个如何在Internet上执行此操作的示例),创建一个{{{ 1}} class使用接收流的构造函数。

我们必须使用哪条视频流?嗯,返回的是:

HtmlDocument

如果使用 HttpWebRequest 进行查询,则可以轻松地将其httpResponse.GetResponseStream(); 属性设置为每次访问新页面之前声明的变量,这样您访问的网站设置的所有Cookie都会正确存储在您CookieContainer中声明的CookieContainer变量中,并计算您只使用{{1}的一个实例1}} class。

希望您能找到有用的解释。无论是否 HtmlAgilityPack 支持,你都可以使用它来计算你想做的事情。

答案 1 :(得分:2)

我还与Rohit Agarwal的BrowserSession课程以及HtmlAgilityPack一起工作。 但对我来说,随后调用“Get-function”并不起作用,因为每次都设置了新的cookie。 这就是我自己添加一些功能的原因。 (我的解决方案远不是完美的方式 - 它只是一个快速而肮脏的修复)但对我来说它有用,如果你不想花很多时间来调查BrowserSession课这里就是我做的:

添加/修改的功能如下:

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
        }
    }

它的作用:它基本上保存了来自最初的“后响应”的cookie,并将相同的CookieContainer添加到稍后调用的请求中。我不完全理解它为什么不在初始版本中工作,因为它在AddCookiesTo函数中以某种方式相同。 (if(Cookies!= null&amp;&amp; Cookies.Count&gt; 0)request.CookieContainer.Add(Cookies);) 无论如何,使用这些添加的功能它现在应该可以正常工作。

可以像这样使用:

//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");
...

我希望当你遇到同样的问题时会有所帮助。