我想知道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(' ', @class, ' '), ' 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
小于半毫秒。