ruby-on-rails – XPath或CSS解析速度更快(对于HTML文件的Nokogiri)?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – XPath或CSS解析速度更快(对于HTML文件的Nokogiri)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道Nokogiri XPath或CSS解析是否可以更快地使用 HTML文件.速度有何不同?

解决方法

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

不到半毫秒.

猜你在找的Ruby相关文章