Ваша проблема в XPather (или XPath для firebug).
Firefox, я думаю, внутренне исправляет плохо отформатированные таблицы, чтобы иметь элемент tbody, даже если в HTML его нет. Нокогири этого не делает, вместо этого он позволяет тегу tr находиться внутри таблицы.
так что велика вероятность того, что ваш путь выглядит к нокогири так:
/html/body/div/table/tr/td/table/tr[2]/td/table/tr/td[2]/table/tr[3]/td/table[3]/tr
и вот как nokogiri примет это:)
Вы можете проверить это
require 'open-uri'
require 'nokogiri'
class String
def relative_to(base)
(base == self[0..base.length-1]) &&
self[base.length..-1]
end
end
module Importer
module XUtils
module_function
def match(text, source)
case text
when String
source.include? text
when Regexp
text.match(source)
when Array
text.all? {|tt| source.include?(tt)}
else
false
end
end
def find_xpath (doc, start, texts)
xpath = start
found = true
while(found)
found = [:inner_html, :inner_text].any? do |m|
doc.xpath(xpath+"/*").any? do |tag|
tag_text = tag.send(m).strip.gsub(/[\302\240]+/, ' ')
if tag_text && texts.all?{|text| match(text, tag_text)}
xpath = tag.path.to_s
end
end
end
end
(xpath != start) && xpath
end
def fetch(url)
Nokogiri::HTML(open(url).read)
end
end
end
Я написал этот небольшой модуль, чтобы помочь мне работать с Nokogiri при веб-обработке и извлечении данных.
основное использование:
include XUtils
doc = fetch("http://some.url.here") # http:// is impotrtant!
base = find_xpath(doc, '/html/body', ["what to find1", "What to find 2"]) # when you provide array, then it'll find element conaining ALL words
precise = find_xpath(doc, base, "what to find1")
precise.relative_to base
Удачи