我在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}"
答案 0 :(得分:2)
我可以看到你期望一个带有类jquery-tablesorter的表。那是因为你在浏览器中检查表并且它有该类。问题是jquery在页面加载后添加了该类。但是由于open-uri不处理javascript,该类永远不会被添加到nokogiri看到的表中。
长话短说,您可能只想使用:
page.css('table.wikitable tr')
答案 1 :(得分:2)
有两个问题:
您正在构建的网址中有一个双斜杠,因此您实际上并未查看您认为正在查看的网页。这是您正在使用的网址:http://en.wikipedia.org//wiki/List_of_Nobel_laureates
,如果您点击该链接,您会看到它重定向到维基百科主页。
您的CSS选择器太具体了,并且包含一些原始页面源中不存在的信息。你应该尝试一个更简单的选择器:
rows = page.css('table.wikitable tr')
具体来说,您在选择器中包含jquery-tablesorter
类。这个类是由JavaScript添加的,但是您使用的工具不会执行页面的JavaScript,因此该类不会出现,您也无法使用它来查找表行。
如果您使用“查看源代码”,而不是浏览器的DOM检查器工具,您将看到未应用任何JavaScript的原始源代码。