2011-11-21 8 views

Respuesta

18

Nokogiri no tiene XPath o CSS que analiza. Analiza XML/HTML en un solo DOM que luego puede usar la sintaxis CSS o XPath para consulta.

Los selectores de CSS se convierten internamente en XPath antes de solicitar a libxml2 que realice la consulta. Como tal (para exactamente los mismos selectores) la versión de XPath sería una pequeña fracción más rápida, ya que el CSS no necesita convertirse primero en XPath.

Sin embargo, su pregunta no tiene una respuesta general; depende de lo que está seleccionando y de cómo se ve su XPath. Lo más probable es que no esté escribiendo el mismo XPath que crea Nokogiri. Por ejemplo, ver si se puede adivinar el XPath para las dos declaraciones CSS siguientes:

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 ')] 

A diferencia de un navegador Web, y idclass atributos no tienen caché acelerada, por lo que seleccionar para ellos no ayuda. De hecho, la interpretación general de div.article implica mucho más trabajo que algo como div[@class='article'].

Como @LBg comentó, debe comparar con usted mismo si la velocidad absoluta es crítica.

Sin embargo, yo sugeriría esto: no se preocupe. Las computadoras son rápido. Escribe lo que sea más conveniente para ti, el programador. Si un selector de CSS es más fácil de crear, más rápido de escribir y más fácil de entender al revisar su código más tarde, use que. Use XPath cuando necesite hacer cosas que no puede hacer con la sintaxis del selector de CSS.

¿Cuánto tarda Nokogiri en convertir un CSS razonablemente complejo en 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 

Menos de medio milisegundo.

+0

Hmm, esa es exactamente la XPath que escribiría. :) El segundo usa la clase "truco" que debe usar al analizar un atributo de clase HTML, que puede tener múltiples valores separados por espacios. –

+0

@Phrogz, "los selectores de CSS se convierten internamente en XPath antes de pedirle a libxml2 que realice la consulta. Como tal (para exactamente los mismos selectores), la versión de XPath sería una fracción más rápida, ya que no es necesario convertir el CSS en XPath primero." Se olvidó de permitir el tiempo de scratching de la cabeza tratando de recordar cómo escribir el acceso en XPath. :-) –

+3

+1 para "no te preocupes por eso". Zactly! Más fácil de entender tiene beneficios a largo plazo en el mantenimiento del código. No me preocupa tanto el tiempo de la computadora, es mi tiempo tratando de entender lo que estaba escrito que me preocupa. –