HtmlAgilityPack 没有找到应该存在的特定节点
HtmlAgilityPack Not Finding Specific Node That Should Be There
我正在加载 URL 并正在寻找应该存在于 HTML 文档中的特定节点,但它每次都返回 null。事实上,我试图找到的每个节点都返回空值。我在其他网页上使用了相同的代码,但出于某种原因,在这种情况下它不起作用。 HtmlDoc 加载的内容是否与我在浏览器中看到的源代码不同?
我显然是网络抓取的新手,但是 运行 多次遇到这种问题,我必须制定一个精心设计的解决方法,因为我无法 select 我的节点可以在我的浏览器中看到。我的做法有什么根本性的错误吗?
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.
该内容是动态添加的,不会出现在通过您当前方法返回的内容中 + url;这就是你的 xpath 不成功的原因。您可以检查返回的内容,例如:
var node = htmlDoc.DocumentNode.SelectSingleNode("//*");
选择第一个存在的东西 url - 展示你可以 select 一个节点
var node = htmlDoc.DocumentNode.SelectSingleNode("//span[@class = 'st']");
您可以使用开发人员工具 > 网络选项卡 > 查看您所追求的任何特定动态内容是否可通过单独的 xhr 请求获得url。
您尝试抓取的页面具有 javascript 代码,可 运行 加载页面的全部内容。因为您的浏览器 运行 是 javascript,所以您会看到页面的全部内容。 HtmlWeb.Load()
没有 运行 任何 javascript 代码,因此您只能看到部分页面。
您可以使用 WebBrowser 控件来抓取该页面。就像您的浏览器一样,它会 运行 任何 javascript 代码,然后加载整个页面。有几篇堆栈溢出文章展示了如何执行此操作。这是其中的一些。
- WebBrowser Control in a new thread
- Perform screen-scape of Webbrowser control in thread
- How to cancel Task await after a timeout period
我正在加载 URL 并正在寻找应该存在于 HTML 文档中的特定节点,但它每次都返回 null。事实上,我试图找到的每个节点都返回空值。我在其他网页上使用了相同的代码,但出于某种原因,在这种情况下它不起作用。 HtmlDoc 加载的内容是否与我在浏览器中看到的源代码不同?
我显然是网络抓取的新手,但是 运行 多次遇到这种问题,我必须制定一个精心设计的解决方法,因为我无法 select 我的节点可以在我的浏览器中看到。我的做法有什么根本性的错误吗?
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.
该内容是动态添加的,不会出现在通过您当前方法返回的内容中 + url;这就是你的 xpath 不成功的原因。您可以检查返回的内容,例如:
var node = htmlDoc.DocumentNode.SelectSingleNode("//*");
选择第一个存在的东西 url - 展示你可以 select 一个节点
var node = htmlDoc.DocumentNode.SelectSingleNode("//span[@class = 'st']");
您可以使用开发人员工具 > 网络选项卡 > 查看您所追求的任何特定动态内容是否可通过单独的 xhr 请求获得url。
您尝试抓取的页面具有 javascript 代码,可 运行 加载页面的全部内容。因为您的浏览器 运行 是 javascript,所以您会看到页面的全部内容。 HtmlWeb.Load()
没有 运行 任何 javascript 代码,因此您只能看到部分页面。
您可以使用 WebBrowser 控件来抓取该页面。就像您的浏览器一样,它会 运行 任何 javascript 代码,然后加载整个页面。有几篇堆栈溢出文章展示了如何执行此操作。这是其中的一些。
- WebBrowser Control in a new thread
- Perform screen-scape of Webbrowser control in thread
- How to cancel Task await after a timeout period