我正在尝试让css处理这个rake任务。
namespace :task do
task test: :environment do
ticketmaster_url = "http://www.ticketmaster.co.uk/derren-brown-miracle-glasgow-04-07-2016/event/370050789149169E?artistid=1408737&majorcatid=10002&minorcatid=53&tpab=-1"
doc = Nokogiri::HTML(open(ticketmaster_url))
#psec-p label
doc.css("#psec-p").each do |price|
puts price.at_css("#psec-p")
byebug
end
end
end
但是我回来了:
#<Nokogiri::XML::Element:0x3fd226469e60 name="fieldset" attributes=[#<Nokogiri::XML::Attr:0x3fd2281c953c name="class" value="group-price widget-group">, #<Nokogiri::XML::Attr:0x3fd2281c9528 name="id" value="psec-p">] children=[#<Nokogiri::XML::Text:0x3fd2281c8d44 "\n ">, #<Nokogiri::XML::Element:0x3fd2281c8c7c name="legend" attributes=[#<Nokogiri::XML::Attr:0x3fd2281c8c18 name="id" value="psec-p-legend">] children=[#<Nokogiri::XML::Text:0x3fd2281c8614 "Price:">]>, #<Nokogiri::XML::Text:0x3fd2281c8448 "\n ">]>
我猜我选择了错误的元素,因为我选择了psec-p
有人能让我知道我哪里出错吗?
我一直关注railscast 190
答案 0 :(得分:0)
http://www.ticketmaster.co.uk上的价格通过Javascript动态应用于HTML。这部分是为了阻止刮擦工作。你真的不能使用Nokogiri从这个领域中抓取这类内容,因为Nokogiri处理原始HTML / XML,并且在此过程中不执行Javascript。存在其他工具,但这些工具需要采用完全不同的方法。
出于学习目的,您应该选择一个不太活跃的网站。例如,http://www.wallacesuk.com有一个很好的,可解析的站点。您可以轻松地学习基本的网络抓取技术,该网站可以提供与页面内联的信息,例如:
从http://ticketmaster.co.uk进行刮痧需要先进的抓取技术,远远超出Railscast 190的演示范围。
答案 1 :(得分:0)
此:
doc.css("#psec-p").each do |price|
puts price.at_css("#psec-p")
byebug
end
可以使用以下方式更好地编写:
puts doc.at('#psec-p')
#psec-p
是一个ID,只能在一个页面中显示一次,因此at
或at_css
会发现一次。