请教各位抓取网页数据的问题(使用HtmlAgilityPack、WebBrowser)

clxering 2015-10-03 09:52:29
获取某页面的部分数据,使用HtmlAgilityPack解析第一页时结果正常。
问题:1、运行后DocumentCompleted事件好像只触发了一次,最终停止在第二页
2、不能获取到新页面的DocumentText,只能反复获取第一页的数据。
请教一下解决方法,感谢!
测试网页地址:http://stock.finance.sina.com.cn/fundInfo/view/FundInfo_LSJZ.php?symbol=100056
测试代码如下:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser targetWeb = sender as WebBrowser;
if (targetWeb.ReadyState == WebBrowserReadyState.Complete)
{
HtmlAgilityPack.HtmlDocument hapHtmlDoc = new HtmlAgilityPack.HtmlDocument();
hapHtmlDoc.LoadHtml(targetWeb.DocumentText);
HtmlNodeCollection targetNodeList = hapHtmlDoc.DocumentNode.SelectNodes("//td[@class='f005'][1]");//获取日期

foreach (HtmlNode test in targetNodeList)
System.Diagnostics.Debug.WriteLine(test.InnerHtml);//测试内容

System.Windows.Forms.HtmlDocument winHtmlDoc = targetWeb.Document;
foreach (HtmlElement item in winHtmlDoc.GetElementsByTagName("a"))
{
if (item.OuterText == "下一页")
{
item.InvokeMember("click");
break;
}
}
}
}
...全文
280 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
clxering 2015-10-04
  • 打赏
  • 举报
回复
感谢两位的回答。1234给出的插入js代码的思路确实可行,问题已经解决。 节选代码如下:

                ……
                HtmlAgilityPack.HtmlDocument hapHtmlDoc = new HtmlAgilityPack.HtmlDocument();
                //插入js
                HtmlElement injectFuntion = targetWeb.Document.CreateElement("script");
                injectFuntion.SetAttribute("type", "text/javascript");
                injectFuntion.SetAttribute("text", @"function getHTML(){var result=document.documentElement.outerHTML;return result;}");
                targetWeb.Document.Body.AppendChild(injectFuntion);
                //===========
                object targetHTML = targetWeb.Document.InvokeScript("getHTML");//获取翻页后源码
                hapHtmlDoc.LoadHtml(targetHTML.ToString());
                ……
clxering 2015-10-04
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
那跟 DocumentCompleted 没有关系,人家根本不刷新页面。 那需要插入 javascript 代码,创建一个新的javascript 对象来保存旧的 GetAjaxData 函数,然后用你的新的GetAjaxData函数来替换旧的 GetAjaxData 函数,新的 GetAjaxData 函数内部要调用旧的 GetAjaxData 函数。
参考插入js的思路,问题已经解决,非常感谢。
  • 打赏
  • 举报
回复
那跟 DocumentCompleted 没有关系,人家根本不刷新页面。 那需要插入 javascript 代码,创建一个新的javascript 对象来保存旧的 GetAjaxData 函数,然后用你的新的GetAjaxData函数来替换旧的 GetAjaxData 函数,新的 GetAjaxData 函数内部要调用旧的 GetAjaxData 函数。
  • 打赏
  • 举报
回复
ajax加载后的页面貌似只有java有个dll支持,net貌似没对应的版本

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧