Nokogiri не имеет XPath или CSS парсинг .Он разбирает XML / HTML в одну модель DOM, которую затем можно использовать с помощью синтаксиса CSS или XPath для запроса .
. Селекторы CSS внутренне превращаются в XPath, прежде чем запросить libxml2 для выполнения запроса.Таким образом (для тех же самых селекторов) версия XPath будет крошечной долей быстрее, поскольку CSS не нужно сначала преобразовывать в XPath.
Однако у вашего вопроса нет общего ответа;это зависит от того, что вы выбираете, и как выглядит ваш XPath.Скорее всего, вы не будете писать тот же XPath, который создает Nokogiri.Например, посмотрите, можете ли вы угадать XPath для следующих двух операторов CSS:
puts Nokogiri::CSS.xpath_for('#foo')
#=> //*[@id = 'foo']
puts Nokogiri::CSS.xpath_for 'div.article a.external'
#=> //div[contains(concat(' ', @class, ' '), ' article ')]//a[contains(concat(' ', @class, ' '), ' external ')]
В отличие от веб-браузера, атрибуты id
и class
не имеют ускоренного кэша, поэтому выберите ихне помогает.Действительно, общая интерпретация div.article
включает в себя гораздо больше работы, чем что-то вроде div[@class='article']
.
Как прокомментировал @LBg, вы должны оценить для себя , если абсолютная скорость критична .
Однако я бы предложил следующее: не беспокойтесь об этом .Компьютеры быстрые .Напишите, что вам удобнее, программист.Если селектор CSS легче создать, быстрее набрать и легче понять при последующем рассмотрении кода, используйте это .Используйте XPath, когда вам нужно сделать то, что вы не можете сделать с помощью синтаксиса селектора CSS.
Сколько времени понадобится Nokogiri для преобразования достаточно сложного CSS в XPath?
t = Time.now
1000.times do |i|
# Use a different CSS string each time to avoid built-in caching
css = "body#foo table#bar#{i} thead th, body#foo table#bar#{i} tbody td"
Nokogiri::CSS.xpath_for(css)
end
puts (Time.now - t)/1000
#=> 0.000405041
Менее чем полмиллисекунды .