nokogiri屏幕刮css选择器问题

时间:2016-05-28 18:58:36

标签: html css ruby-on-rails web-scraping nokogiri

我正在尝试让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

2 个答案:

答案 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,只能在一个页面中显示一次,因此atat_css会发现一次。