как использовать методы nokogiri .xpath & .at_xpath - PullRequest
5 голосов
/ 22 января 2010

Я учусь пользоваться нокогири, и ко мне пришло несколько вопросов на основе приведенного ниже кода

require 'rubygems'
require 'mechanize'

post_agent = WWW::Mechanize.new
post_page = post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')

puts "\nabsolute path with tbody gives nil"
puts  post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]').xpath('text()').to_s.strip.inspect

puts "\n.at_xpath gives an empty string"
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").at_xpath('text()').to_s.strip.inspect

puts "\ntwo lines solution with .at_xpath gives an empty string"
rows =   post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")
puts rows[0].at_xpath('text()').to_s.strip.inspect


puts
puts "two lines working code"
rows =   post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")
puts rows[0].xpath('text()').to_s.strip

puts "\none line working code"
puts post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip

puts "\nanother one line code"
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").xpath('text()').to_s.strip

puts "\none line code with full path"
puts post_page.parser.xpath("/html/body/div/div/div/div/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip
  • лучше использовать // или / в xpath? @ AnthonyWJones говорит, что «использование префикса //» не очень хорошая идея
  • Мне пришлось удалить tbody из любого рабочего xpath, иначе я получил результат 'nil'. Как можно удалить элемент из xpath, чтобы все заработало?
  • нужно ли дважды использовать .xpath для извлечения данных, если не используется полный xpath?
  • почему я не могу заставить .at_xpath работать для извлечения данных? это хорошо работает здесь в чем разница?

1 Ответ

8 голосов
/ 22 января 2010
  1. // означает каждый узел на каждом уровне, поэтому он намного дороже по сравнению с /
  2. вы можете использовать * в качестве заполнителя.
  3. Нет, вы можете сделать запрос XPath, получить элемент и затем вызвать метод nokogiri text на узле
  4. Конечно, вы можете. Посмотрите на этот вопрос и мой файл тестов. Вы увидите пример at_xpath.

Я обнаружил, что вы часто используете выражение text(). Это не требуется с помощью Nokogiri. Вы можете извлечь узел, а затем вызвать метод text на узле. Это намного дешевле.

Также помните, что Nokogiri поддерживает селекторы .css. Они могут быть проще, если вы работаете с HTML-страницами.

...