使用 Nokogiri 解析 JavaScript 隐藏 HTML



我正在尝试使用Nokogiri来解析这个ASCAP网站以检索一些歌曲/艺术家信息。下面是我要查询的内容的示例

https://mobile.ascap.com/aceclient/AceClient/#ace/writer/1628840/JAY%20Z

我似乎无法正确访问 DOM,因为源代码似乎隐藏在某种 JavaScript 后面。我对网络抓取很陌生,所以很难找到一种方法来做到这一点。我尝试使用Charles来查看数据是否是从另一个站点提取的,并且一直在使用XHelper来生成准确的XPath查询。

这将返回 nil,它应该返回 "1, 2 YA'LL">

page = Nokogiri::HTML(open('https://mobile.ascap.com/aceclient/AceClient/#ace/writer/1628840/JAY%20Z'))
puts page.xpath('/html/body/div[@id="desktopSearch"]/div[@id='ace']/div[@id="aceMain"]/div[@id="aceResults"]/ul[@id="ace_list"]/li[@class="nav"][1]/div[@class="workTitle"]').text

抓取/抓取时的步骤 #1 是关闭浏览器中的 JavaScript,然后查看页面。你看到的就是Nokogiri看到的。如果您想要的数据是可见的,那么您可以使用解析器获得它的几率真的很大。

此时,不要依赖检查元素时看到的浏览器的 XPath 或 CSS 选择器列表来显示所需节点的路径。浏览器在显示页面时会执行大量修正,源视图通常会反映这些修正,包括显示动态检索的数据。换句话说,浏览器在最初从页面检索的内容上向您撒谎。若要解决此问题,请在命令行中使用 wgetcurlnokogiri http://some_URL 来检索原始页面,然后找到所需的节点。

如果你没有看到你想要的节点,那么你将需要使用其他工具,比如Watir suite中的东西,它允许你驱动一个理解JavaScript的浏览器。浏览器可以检索页面、解释 JavaScript 以及检索任何动态页面内容。然后,您应该能够获取标记并将其传递给Nokogiri。

使用谷歌检查器工具来记录XMLHTTPRequests,并且能够轻松找出数据的实际加载位置。感谢@NickVeys!

相关内容

  • 没有找到相关文章

最新更新