如何用Ruby中的Nokogiri解析HTML

时间:2013-04-10 16:06:05

标签: ruby html-parsing nokogiri

我正在尝试使用Nokogiri解析一些HTML并且遇到了一些问题。我想通过每个“雇主评论”课程,并在“专业”和“缺点”下捕捉内容。

我在完成第一部分时遇到了麻烦:让一个项目返回控制台。

require 'open-uri'
require 'nokogiri'


doc = Nokogiri::HTML(open('http://www.glassdoor.com/Reviews/Microsoft-Reviews-E1651.htm'))

doc.css('//*[@id="empReview_2320868"]/div[1]/p[1]/tt').each do |link|
puts link.content
end

3 个答案:

答案 0 :(得分:1)

一个问题是,您正在为需要CSS的方法使用XPath访问器:

doc.css('//*[@id="empReview_2320868"]/div[1]/p[1]/tt')

您可以使用searchxpath代替XPath。

但是找不到你想要的节点。一个简单的测试表明它们不存在:

doc.css("#empReview_2320868")

应返回一些内容,但会返回[],这意味着任何代码中都不存在ID。

答案 1 :(得分:0)

以下是使用CSS而不是XPath更接近查找所需数据的一种方法:

require 'open-uri'
require 'nokogiri'

doc = Nokogiri::HTML(open('http://www.glassdoor.com/Reviews/Microsoft-Reviews-E1651.htm'))

doc.css('div.employerReview > div.description > p > strong').each do |item|
  puts item.content
  item.parent.css('tt').each do |details|
    puts details.content
  end
end

答案 2 :(得分:0)

您已将xpath传递给css选择器。

require 'open-uri'
require 'nokogiri'

doc = Nokogiri::HTML(open('http://www.glassdoor.com/Reviews/Microsoft-Reviews-E1651.htm'))
ps = doc.xpath('//div[@class="employerReview"]//div[@class="description"]/p[position()<3]')

ps.map{|p| p.text.strip}.each_slice(2) do |pros, cons|
  puts pros
  puts cons
end

指定的xpath包含Pros -Cons -部分,如果这不是您想要的,您可以将xpath更改为

//div[@class="employerReview"]//div[@class="description"]/p[position()<3]/tt