2010-01-17 15 views
21

No he encontrado ninguna documentación ni tutorial para eso. ¿Existe algo así?¿Cómo uso XPath en Nokogiri?


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr') 

El código anterior conseguirme cualquier table, en cualquier lugar, que tiene un niño tbody con el atributo id igual a "threadbits_forum_251". ¿Pero por qué comienza con el doble //? ¿Por qué hay /tr al final? Consulte "Ruby Nokogiri Parsing HTML table II" para obtener más detalles.


¿Puede alguien decirme cómo extraer href, id, alt, src, etc., utilizando Nokogiri?

td[3]/div[1]/a/text()' <--- extracts text 

¿Cómo puedo extraer otras cosas?

Respuesta

41

Parece que necesita para leer significa un XPath Tutorial

Su //table/tbody[@id="threadbits_forum_251"]/tr expresión:

  • // - cualquier parte del documento XML
  • table/tbody - tomar un elemento de la tabla con un niño tbody
  • [@id="threadbits_forum_251"] - donde id atributo son iguales a "threadbits_forum_251"
  • tr - y tomar sus tr elementos

Así que, básicamente, lo que necesita saber:

  • atributos comienza con @
  • condiciones de entrar [] soportes

Si yo entendió correctamente que API, puede ir con doc.xpath("td[3]/div[1]/a")["href"] o td[3]/div[1]/a/@href i f solo hay un elemento <a>.

+0

@Rubens gracias. Y tienes razón, necesito leer el Tutorial de XPath. Pensé que era un doc nokorigi que tenía que leer ... ¿Sabrías si hay alguna herramienta que me dé un Xpath completo si hago clic y objeta en la página html? – Radek

+8

No lo sé, pero XPath no es tan difícil; considere su sistema de archivos, y supongamos que cada carpeta es un elemento XML; entonces, cuando seleccionas tu carpeta 'system32', obtendrás la ruta' \ windows \ system32'; simplemente reemplace ese '\\' 'por'/', considere los atributos que comienzan con' @ 'y las condiciones por' [] 'y está listo para ir –

+2

Sé que esta es una respuesta anterior pero el enlace al tutorial xpath es ahora roto. Creo que ahora debería ser http://www.w3schools.com/xsl/xpath_intro.asp – Axiombadger

6

Su XPath es correcta y que parecen haber respondido a la primera parte de su propia pregunta (casi):

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr') 

"el código de arriba me va a conseguir cualquier mesa de tr de mesa, cualquier lugar, que tiene un niño tbody con el atributo id igual a threadbits_forum_251"


// significa que el siguiente elemento puede aparecer en cualquier parte del documento.

/tr al final significa, obtener el nodo tr del elemento coincidente.

No necesita extraer cada atributo uno por uno.Acaba de obtener todo el nodo que contiene los cuatro atributos en Nokogiri, y obtener los atributos usando:

theNode['href'] 
theNode['src'] 

Dónde theNode es su objeto Nokogiri Node.


Editar:

Lo siento, no he utilizado estas bibliotecas, pero creo que la evaluación y el análisis XPath se está haciendo por Mechanize. Así que aquí está cómo obtendría todo el elemento y sus atributos de una vez.

doc.xpath("td[3]/div[1]/a").each do |anchor| 
    puts anchor['href'] 
    puts anchor['src'] 
    ... 
end 
+0

@Anurag gracias por una buena explicación. Estoy usando mecanize no puro nokogiri, ¿puedo usar theNode ['href'] de alguna manera en [: title, 'td [3]/div [1]/a/text()'] ,? Quiero extraer href en lugar de texto – Radek

+1

'[: address, 'td [3]/div [1]/a/@ href']'? –

+0

estaba buscando nokogiri tutoriales y encontré mi propia respuesta ... jeje :) – Anurag

Cuestiones relacionadas