使用Nokogiri解析JavaScript隐藏的HTML

Using Nokogiri to parse JavaScript hidden HTML

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

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

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

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

1
2
3
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


使用google inspector工具记录XMLHTTPRequests,并且能够轻松确定实际从何处加载数据。感谢@NickVeys!


抓取/抓取时的步骤1是关闭浏览器中的JavaScript,然后查看页面。那时您所看到的就是Nokogiri所看到的。如果所需数据可见,那么使用解析器就可以解决问题。

那时候,请勿依赖于在检查元素以显示所需节点的路径时看到的浏览器的XPath或CSS选择器列表。浏览器在显示页面时会做很多修复工作,而源视图通常会反映出这些问题,包括显示动态检索的数据。换句话说,浏览器对您撒谎的是它最初从页面中检索到的内容。要解决此问题,请在命令行中使用wgetcurlnokogiri http://some_URL来检索原始页面,然后找到所需的节点。

如果没有看到所需的节点,则将需要使用其他工具,例如Watir套件中的某些工具,该工具可以驱动能够理解JavaScript的浏览器。浏览器可以检索页面,解释JavaScript并检索任何动态页面内容。然后,您应该能够获得标记并将其传递给Nokogiri。