tuto – ruby – nokogiri

Nokogiri est une librairie ruby qui permet de parser du contenu html (ainsi que du xml accessoirement).

on débute le code avec les libs :

require 'mechanize'
require 'nokogiri'

 

instance mechanize pour avoir notre petit robot simple :

     @agent = Mechanize.new do |a|
        a.user_agent_alias = 'Mac Safari'
        a.max_history = 1
        a.read_timeout = 5
        a.keep_alive = false
      end

 

on récupère l’url que l’on souhaite

       page = @agent.get url

 

et on parse simplement le code html (ici  on récupère tous les H1)

     doc = Nokogiri::HTML::DocumentFragment.parse(page.body)
     puts doc.search('h1').map { |n| n.inner_text }

 

On peut coupler nokogiri avec la librairie standard mechanize pour récupèrer la balise description

     puts page.at('meta[@name="description"]')[:content]

 

 

une autre astuce sympa avec nokogiri, parser la page web et tester la présence d’expressions régulières, ici des regex de type « ip:port » ou « domaine:port » :

      lst_proxy = []
      regex_ip_port = '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?:?[0-9]{0,5})\b'
      regex_domain_port = '^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}:[0-9]{0,5}$'
      doc = Nokogiri::HTML(page.body)
      res = doc.xpath("//text()").text

      res.each do |part|
          temp_part = part.split(" ")
          temp_part.each do |sub_part| 
            if sub_part.match(regex_domain_port)
              puts sub_par
              lst_proxy << sub_part
            elsif sub_part.match(regex_ip_port) 
              puts sub_part
              lst_proxy << sub_part    
            end
          end
      end