HtmlAgilityPack和身份验证

10

如果我有一个特定的网址,我可以获取该页面的id和xpath。但是如何在请求中传递用户名和密码以便我可以抓取需要登录才能访问的url?

using HtmlAgilityPack;

_web = new HtmlWeb();

internal Dictionary<string, string> GetidsAndXPaths(string url)
{
    var webidsAndXPaths = new Dictionary<string, string>();
    var doc = _web.Load(url);
    var nodes = doc.DocumentNode.SelectNodes("//*[@id]");
    if (nodes == null) return webidsAndXPaths;
    // code to get all the xpaths and ids

我应该使用一个网络请求来获取网页源代码,然后将那个文件传递到上面的方法中吗?

var wc = new WebClient();
wc.Credentials = new NetworkCredential("UserName", "Password");
wc.DownloadFile("http://somewebsite.com/page.aspx", @"C:\localfile.html");

首先,我会粘贴您遇到的任何错误。其次,尝试使用 System.Net.Http.HttpClient,因为它更清楚如何设置身份验证详细信息。 - Michael J. Gray
1个回答

5

HtmlWeb.Load有很多重载,可以接受NetworkCredential的实例,也可以直接传入用户名和密码。

Name // Description 
Public method Load(String) //Gets an HTML document from an Internet resource.  
Public method Load(String, String) //Loads an HTML document from an Internet resource.  
Public method Load(String, String, WebProxy, NetworkCredential) //Loads an HTML document from an Internet resource.  
Public method Load(String, String, Int32, String, String) //Loads an HTML document from an Internet resource. 

您不需要传递WebProxy实例,或者可以传递系统默认实例。

另外,您可以连接HtmlWeb.PreRequest并设置请求的凭据。

htmlWeb.PreRequest += (request) => {
    request.Credentials = new NetworkCredential(...);
    return true;
};

htmlWeb.PreRequestHandler +=should be htmlWeb.PreRequest += - mortb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接