Как разобрать HTML с помощью Nokogiri в Ruby

Я пытаюсь разобрать HTML-код с помощью Nokogiri, и у меня возникают некоторые проблемы. Я хочу пройтись по каждому классу «employerReview» и зафиксировать контент в разделе «за» и «против».

У меня возникли проблемы с выполнением первой части: вернуть один элемент на консоль.

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

person sharataka    schedule 10.04.2013    source источник


Ответы (3)


Вот один из способов приблизиться к поиску данных, которые вы ищете, используя 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
person summea    schedule 10.04.2013

Одна из проблем заключается в том, что вы используете метод доступа XPath для метода, который ожидает CSS:

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

Вместо этого вы можете использовать search или xpath для XPath.

Однако это не находит нужные вам узлы. Простой тест показывает, что их не существует:

doc.css("#empReview_2320868")

должен что-то вернуть, но возвращает [], что означает, что ID не существует ни в одном теге.

person the Tin Man    schedule 10.04.2013
comment
На самом деле, глядя на источник страницы, кажется, что это так: <div id="empReview_2320868" class="employerReview" itemprop="review".... - person fmendez; 10.04.2013

Вы передали 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
person Arie Xiao    schedule 10.04.2013