我正在尝试让 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
有人可以让我知道我哪里出错了吗?
我一直在遵循轨道广播 190
http://www.ticketmaster.co.uk 的价格通过Javascript动态应用于HTML。 这样做部分是为了阻碍抓取工作。 你真的不能使用Nokogiri从这个域中抓取这种类型的内容,因为Nokogiri处理原始的HTML/XML,并且在此过程中不执行Javascript。 存在其他工具可以做到这一点,但这些工具需要完全不同的方法。
出于学习目的,您应该选择一个动态性较低的网站。 例如,http://www.wallacesuk.com 有一个很好的、可解析的网站。 您可以通过一个显示与页面内联信息的网站轻松学习基本的网络抓取技术,例如这个。
从 http://ticketmaster.co.uk 抓取需要先进的抓取技术,远远超出了Railscast 190所展示的范围。
这个:
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
会发现该一次出现。