对于一个班级的项目,我正在尝试抓取一个网站。在此网站上,
https://disneyworld.disney.go.com/attractions/
我正在尝试提取所有引诱URL。例如,对于列表中的第一个景点,我正在尝试获取以下网址:
https://disneyworld.disney.go.com/attractions/epcot/mission-space-advanced-training-lab/
由于该网站使用Javascript,因此我很难使用Nokogiri和选择器来获取网址。类名似乎不起作用,我的尝试返回的URL与尝试获取的URL不同。我最好的是:
index_page.css("ul").children.css("li").each do |container|
但是容器返回错误的URL。有人建议我使用宝石娃娃,但我和我的导师都无法弄清楚如何使用它。
任何想法都会受到赞赏。
答案 0 :(得分:1)
我假设您正在使用open-uri
之类的内容加载页面。该网站有点奇怪,因为对https://disneyworld.disney.go.com/attractions/的第一个请求未返回景点列表。该列表由后续的XMLHttpRequest返回到相同的URL。因此,您可能根本看不到内容中的结果。
您可以使用mechanize之类的宝石来模拟XMLHttpRequest(并做很多其他事情)。这是一个获取这些吸引力网址的工作示例:
require 'mechanize'
url = 'https://disneyworld.disney.go.com/attractions/'
mech = Mechanize.new;
# make an XMLHttpRequest to get the page (returns attraction list)
mech.get(url, [], nil, { 'x-requested-with' => 'XMLHttpRequest' }) do |page|
page.search('ul.finderList li').each do |attraction|
name = attraction.at_css('h2.cardName').content
link = attraction.at_css('a')['href']
puts "#{name}: #{link}"
end
end
page.search
方法返回一个Nokogiri节点集,因此您可以使用Nokogiri方法进行进一步处理。