解决方法
Nokogiri没有XPath或CSS解析.它将
XML / HTML解析为单个DOM,然后您可以使用CSS或XPath语法进行查询.
在请求libxml2执行查询之前,CSS选择器在内部转换为XPath.因此(对于完全相同的选择器),XPath版本会快一点,因为CSS不需要首先转换为XPath.
但是,你的问题没有一般性答案;这取决于你选择的是什么,以及你的XPath是什么样的.有可能,你不会像Nokogiri那样编写相同的XPath.例如,看看你是否可以猜测以下两个CSS语句的XPath:
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(' ',' external ')]
与Web浏览器不同,id和class属性没有加速缓存,因此选择它们并没有帮助.实际上,div.article的一般解释涉及的工作远比div [@ class =’article’]更多.
正如@LBg评论的那样,如果绝对速度至关重要,你应该自己做基准测试.
但是,我建议这样做:不要担心.电脑很快.编写最方便的程序员.如果CSS选择器更容易制作,键入速度更快,并且在以后查看代码时更容易理解,请使用它.当您需要执行使用CSS选择器语法无法执行的操作时,请使用XPath.
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
不到半毫秒.