2010-01-22 3 views
5

Я учусь, как использовать nokogiri и несколько вопросов пришли ко мне на основе кода нижекак использовать nokogiri методы .xpath & .at_xpath

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 говорит, что использование неиспользуемого // не является хорошей идеей
  • Мне пришлось удалять труп из любого рабочего xpath, иначе я получил результат «nil». Как можно удалить элемент из xpath, чтобы заставить работу работать?
  • Должен ли я использовать .xpath дважды, чтобы извлечь данные, если не использовать полный xpath?
  • Почему я не могу сделать .at_xpath работать для извлечения данных? он отлично работает here В чем разница?

ответ

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

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

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

+0

@ Симоне Карлетти: вам это нужно. Возможно, все мои вопросы приходят, потому что я не знаю, как читать документацию на http://nokogiri.org. Я не знаю, как найти что-либо о вызове текстового метода на узле. Можно ли написать об этом больше. Я уже нашел, что мой скрипт немного медленный, было бы здорово сделать это быстрее. – Radek

+0

Я обнаружил, что местозаполнитель XPath - это реальное выражение xpath. Итак, что значит использовать * в качестве заполнителя? – Radek

+0

* означает любой узел. Например, в '/ node/foo/one' и'/node/bar/one', '/ node/*/one' соответствует оба пути. –

Смежные вопросы