2

我无法从Nokogiri的“诺贝尔奖获得者名单”中抓取行。

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

原始教程是“编写网络爬虫”。

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}"
4

2 回答 2

2

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

长话短说,您可能只想选择:

page.css('table.wikitable tr')
于 2013-06-24T06:53:47.747 回答
2

有两个问题:

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

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

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

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

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

于 2013-06-24T06:54:18.307 回答