我正在加载一个URL,并正在寻找HTML文档中应该存在的特定节点,但是每次它都返回null。实际上,我尝试查找的每个节点都返回null。我在其他网页上也使用了相同的代码,但是由于某种原因,它无法正常工作。 HtmlDoc是否可以加载与我在浏览器中看到的源不同的内容?
我显然不是Web爬虫的新手,但是由于无法选择浏览器中可以看到的节点,因此不得不多次尝试解决这种问题。我要怎么处理这根本上有问题?
string[] arr = { "abercrombie", "adt" };
for(int i=0;i<1;i++)
{
string url = @"https://www.google.com/search?rlz=1C1CHBF_enCA834CA834&ei=lsfeXKqsCKOzggf9ub3ICg&q=" + arr[i] + "+ticker" + "&oq=abercrombie+ticker&gs_l=psy-ab.3..35i39j0j0i22i30l2.102876.105833..106007...0.0..0.134.1388.9j5......0....1..gws-wiz.......0i71j0i67j0i131j0i131i67j0i20i263j0i10j0i22i10i30.3zqfY4KZsOg";
HtmlWeb web = new HtmlWeb();
var htmlDoc = web.Load(url);
var node = htmlDoc.DocumentNode.SelectSingleNode("//span[@class = 'HfMth']");
Console.WriteLine(node.InnerHtml);
}
更新
感谢RobertBaron为我指明了正确的方向。这是一个很棒的复制粘贴solution。
答案 0 :(得分:1)
您要抓取的页面具有javascript代码,该代码可以运行以加载页面的全部内容。因为您的浏览器运行的是JavaScript,所以您可以看到页面的全部内容。 HtmlWeb.Load()
不运行任何javascript代码,因此您只会看到部分页面。
您可以使用WebBrowser控件来抓取该页面。就像您的浏览器一样,它将运行任何javascript代码,并且整个页面将被加载。有一些堆栈溢出文章显示了如何执行此操作。这里有一些。
答案 1 :(得分:0)
该内容是动态添加的,不会出现在通过当前方法+ url返回的内容中;这就是为什么您的xpath不成功的原因。您可以检查返回的内容,例如:
var node = htmlDoc.DocumentNode.SelectSingleNode("//*");
选择第一个网址中存在的内容-以显示您可以选择一个节点
var node = htmlDoc.DocumentNode.SelectSingleNode("//span[@class = 'st']");
您可以使用开发人员工具>网络标签>查看您要访问的任何特定动态内容是否可以通过单独的xhr请求网址获得。