微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

不到半毫秒.

原文地址:https://www.jb51.cc/ruby/267464.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐