如何选择Nokogiri的表格行?

时间:2013-06-24 06:36:05

标签: ruby nokogiri wikipedia

我在Nokogiri的“List of Nobel laureates”中抓取行时遇到了麻烦。

我相信我的CSS选择器是正确的,但它返回空。

原始教程是“Writing a Web Crawler”。

require 'rubygems'
require 'nokogiri'
require 'open-uri'

BASE_WIKIPEDIA_URL = 'http://en.wikipedia.org/'
LIST_URL = "#{BASE_WIKIPEDIA_URL}/wiki/List_of_Nobel_laureates"

page = Nokogiri::HTML(open(LIST_URL))
rows = page.css('div#content.mw-body div#bodyContent div#mw-content-text.mw-content-ltr table.wikitable.sortable.jquery-tablesorter tr')

puts "length : #{rows.size}"

2 个答案:

答案 0 :(得分:2)

我可以看到你期望一个带有类jquery-tablesorter的表。那是因为你在浏览器中检查表并且它有该类。问题是jquery在页面加载后添加了该类。但是由于open-uri不处理javascript,该类永远不会被添加到nokogiri看到的表中。

长话短说,您可能只想使用:

page.css('table.wikitable tr')

答案 1 :(得分:2)

有两个问题:

  1. 您正在构建的网址中有一个双斜杠,因此您实际上并未查看您认为正在查看的网页。这是您正在使用的网址:http://en.wikipedia.org//wiki/List_of_Nobel_laureates,如果您点击该链接,您会看到它重定向到维基百科主页。

  2. 您的CSS选择器太具体了,并且包含一些原始页面源中不存在的信息。你应该尝试一个更简单的选择器:

    rows = page.css('table.wikitable tr')
    

    具体来说,您在选择器中包含jquery-tablesorter类。这个类是由JavaScript添加的,但是您使用的工具不会执行页面的JavaScript,因此该类不会出现,您也无法使用它来查找表行。

    如果您使用“查看源代码”,而不是浏览器的DOM检查器工具,您将看到未应用任何JavaScript的原始源代码。