我试图在c#webforms项目中使用HTMLAgilityPack抓取网页。
我见过的所有解决方案都使用WebBrowser控件。但是,根据我的判断,这仅适用于WinForms项目。
目前我通过以下代码调用所需的页面:
var getHtmlWeb = new HtmlWeb();
var document = getHtmlWeb.Load(inputUri);
HtmlAgilityPack.HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//div[@class=\"nav\"]");
我见过使用WebBrowser控件的一段代码:
if (this.webBrowser1.Document.GetElementsByTagName("html")[0] != null)
_htmlAgilityPackDocument.LoadHtml(this.webBrowser1.Document.GetElementsByTagName("html")[0].OuterHtml);
任何有关如何在加载AJAX后抓取页面的建议/指示都将不胜感激。
答案 0 :(得分:3)
似乎使用HTMLAgilityPack只能抓取通过html本身加载的内容。因此,通过AJAX加载的任何内容都不会被HTMLAgilityPack看到。
最简单的选择 - 可行 - 是使用基于浏览器的工具(如Firebug)来确定AJAX加载的数据源。然后直接操作源数据。这样做的另一个优点可能是刮掉更大的数据集。
答案 1 :(得分:0)
我一整天都在努力解决这个问题,所以这里是一个 FedEx 跟踪示例,说明接受的答案所指的内容(我认为):
Dim body As String
body = "data={""TrackPackagesRequest"":{""appType"":""WTRK"",""appDeviceType"":""DESKTOP"",""supportHTML"":true,""supportCurrentLocation"":true,""uniqueKey"":"""",""processingParameters"":{},""trackingInfoList"":[{""trackNumberInfo"":{""trackingNumber"":" & Chr(34) & "YOUR TRACKING NUMBER HERE" & Chr(34) & ",""trackingQualifier"":"""",""trackingCarrier"":""""}}]}}"
body = body & "&action=trackpackages&locale=en_US&version=1&format=json"
With CreateObject("MSXML2.XMLHTTP")
.Open("POST", "https://www.fedex.com/trackingCal/track", False)
.setRequestHeader("Referer", "https://www.fedex.com/apps/fedextrack/?tracknumbers=YOUR TRACKING NUMBER HERE")
.setRequestHeader("User-Agent", "Mozilla/5.0")
.setRequestHeader("X-Requested-With", "XMLHttpRequest")
.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
.send(body)
Dim Reply = .responseText
End With
或者,您是否考虑过使用 Cefsharp.net 将浏览器构建到您的应用程序中,然后通过 .net 界面使用开发工具?
您可能已经注意到,即使是动态 AJAX/JS 生成的 HTML 也可以使用例如找到在 Firefox 中检查元素选项。因此,即使您无法使用传统的 HTML 抓取方法抓取它,该代码也会留在您的计算机上。
要考虑的另一种选择。