web-dev-qa-db-fra.com

Comment utiliser XPath dans Nokogiri?

Je n'ai trouvé aucune documentation ni tutoriel pour ça. Existe-t-il quelque chose comme ça?


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

Le code ci-dessus me donnera n'importe quel table, n'importe où, qui a un enfant tbody avec l'attribut id égal à "threadbits_forum_251". Mais pourquoi ça commence par un double //? Pourquoi il y a /tr à la fin? Voir " Ruby Nokogiri Parsing HTML table II " pour plus de détails.


Quelqu'un peut-il me dire comment extraire href, id, alt, src, etc., en utilisant Nokogiri?

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

Comment puis-je extraire d'autres choses?

25
Radek

Semble que vous devez lire un XPath Tutorial

Votre expression //table/tbody[@id="threadbits_forum_251"]/tr Signifie:

  • // - N'importe où dans votre document XML
  • table/tbody - prenez un élément de table avec un enfant tbody
  • [@id="threadbits_forum_251"] - l'attribut id est égal à "threadbits_forum_251"
  • tr - et prenez ses éléments tr

Donc, fondamentalement, vous devez savoir:

  • les attributs commencent par @
  • les conditions vont entre crochets []

Si j'ai bien compris cette API, vous pouvez utiliser doc.xpath("td[3]/div[1]/a")["href"] ou td[3]/div[1]/a/@href S'il n'y a qu'un seul élément <a>.

46
Rubens Farias

Votre XPath est correct et vous semblez avoir répondu (presque) à la première partie de votre propre question:

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

"le code ci-dessus me donnera table tr de la table, n'importe où , qui a un enfant tbody avec l'ID d'attribut égal à threadbits_forum_251 "


// signifie que l'élément suivant peut apparaître n'importe où dans le document.

/tr à la fin signifie, obtenir le nœud tr de l'élément correspondant.

Vous n'avez pas besoin d'extraire chaque attribut un par un. Obtenez simplement le nœud entier contenant les quatre attributs dans Nokogiri, et obtenez les attributs en utilisant:

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

theNode est votre objet Nokogiri Node .


Éditer:

Désolé, je n'ai pas utilisé ces bibliothèques, mais je pense que l'évaluation et l'analyse XPath sont effectuées par Mechanize. Voici donc comment obtenir l'ensemble de l'élément et ses attributs en une seule fois.

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