Nous disposons donc d’un document HTML, mais nous voulons des données, ce qui signifie que nous devons analyser la réponse précédente pour obtenir des informations lisibles par l’homme.
Commençons par de petits pas : extrayons le titre du site web. Une caractéristique remarquable de Ruby est que tout est un objet, à quelques exceptions près, ce qui signifie que même une simple chaîne de caractères peut avoir des attributs et des méthodes.
Nous pouvons donc simplement accéder à la valeur du titre du site web via les attributs de l'objet parsed_page.
puts parsed_page.title
Passons à l'étape suivante : extrayons tous les liens du site web. Pour cela, nous allons utiliser une méthode plus générique qui analyse des balises spécifiques, la méthode css.
links = parsed_page.css('a')
links.map {|element| element["href"]}
puts links
Nous utilisons également la méthode map pour ne conserver que les liens dotés d'un attribut href dans le code HTML.
Prenons un exemple plus concret. Nous devons extraire les articles du blog, leur titre, leur adresse et leur méta-description.
Si vous inspectez l’une des fiches d’article, vous pouvez voir que nous pouvons obtenir l’adresse et le titre de l’article grâce aux attributs du lien. De plus, la méta-description se trouve sous une balise <div> avec un nom de classe spécifique.
Bien sûr, il existe de nombreuses façons d’effectuer cette recherche. Celle que nous allons utiliser consistera à rechercher toutes les balises <div> ayant le nom de classe td_module_10, puis à parcourir chacune d’entre elles pour extraire les balises <a> et les balises internes ayant le nom de classe td-excerpt.
article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")
article_cards.each do |card|
title = card.xpath("div[@class='td-module-thumb']/a/@title")
link = card.xpath("div[@class='td-module-thumb']/a/@href")
meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")
end
Oui, comme vous l'avez peut-être déjà deviné, c'est une expression XPath qui permet d'y parvenir, car nous recherchons des éléments HTML par leurs noms de classe et leurs ancêtres.