Что такое Нокогири?


В ДВУХ СЛОВАХ;

Нокогири — это японская тяговая пила. О… не помогло? Продолжайте читать.

Гем

Nokogiri входит в стандартный набор Gem-файлов приложений Rails. Я впервые обратил на него внимание, потому что он появился в ошибке Bundler.

Nokogiri — это малозависимый модуль, написанный на C, Java и Ruby, который анализирует XML и HTML, чтобы эти протоколы могли быть использованы Ruby. Давайте приступим.

Использование Nokogiri для разбора HTML

Вы хотите использовать Ruby для извлечения данных с веб-страницы?

Сначала запустите nokogiri -v и посмотрите, получите ли вы ответ с номером версии. Если нет, вам придется выполнить gem i nokogiri.

➜  ~ irb --simple-prompt
>> require 'nokogiri'
=> true
>> Nokogiri
=> Nokogiri
Войдите в полноэкранный режим Выйти из полноэкранного режима

Не забудьте затребовать его, иначе вы получите NameError для неинициализированной константы.

Сначала мы начнем с разбора созданного нами HTML, а затем разберем реальную веб-страницу.

# First, put some valid html into a string.
>> html = "<h1>Hello World!</h1>
<section><h2>A List of Stuff</h2>
<ul><li>Camera</li>
<li>Computer</li>
<li>Television</li>
</ul></section>"
# Now pass that string into the HTML5 module as an argument
>> document = Nokogiri::HTML5(html)
Вход в полноэкранный режим Выйдите из полноэкранного режима

Вы должны получить следующий ответ

=>
#(Document:0x4c4 {
  name = "document",
  children = [
    #(Element:0x4d8 {
      name = "html",
      children = [
        #(Element:0x4ec { name = "head" }),
        #(Element:0x500 {
          name = "body",
          children = [
            #(Element:0x514 {
              name = "h1",
              children = [ #(Text "Hello World!")]
              }),
            #(Element:0x528 {
              name = "section",
              children = [
                #(Element:0x53c {
                  name = "h2",
                  children = [ #(Text "A List of Stuff")]
                  }),
                #(Element:0x550 {
                  name = "ul",
                  children = [
                    #(Element:0x564 {
                      name = "li",
                      children = [ #(Text "Camera")]
                      }),
                    #(Element:0x578 {
                      name = "li",
                      children = [ #(Text "Computer")]
                      }),
                    #(Element:0x58c {
                      name = "li",
                      children = [ #(Text "Television")]
                      })]
                  })]
              })]
          })]
      })]
  })
Вход в полноэкранный режим Выход из полноэкранного режима

Модуль HTML5 Nokogiri принял нашу строку HTML и вернул нам класс Document, который имеет свой собственный набор методов. Давайте рассмотрим несколько. (Помните, что вы всегда можете перечислить все методы, используя Document.methods.sort).

Document#children

Этот метод вернет массив типа XML::NodeSet. Его длина равна единице, потому что это элемент <html>...</html>, который мы так и не включили в нашу строку. У этого элемента есть два дочерних элемента, теги <head>...</head> и <body>...</body>.

>> body = document.children.children.last
=>
#(Element:0x80c {
...
>> ul = body.children.children.children
=> [#<Nokogiri::XML::Text:0x8c0 "A List of Stuff">, #<Nokogiri::XML::Elemen...
?> => [#<Nokogiri::XML::Text:0x8c0 "A List of Stuff">, #<Nokogiri::XML::Elemen..
.
>> >> ul.children.length
>> => 3
?> ?> ul.children.each do |child|
>> ?>   puts child.text
>> >> end
>> Camera
>> Computer
>> Television
Вход в полноэкранный режим Выход из полноэкранного режима

Парсинг HTML из Интернета

Я слышал, что Интернет — это хорошее место для поиска HTML-документов для разбора. Вы можете получить некоторые из этих HTML-документов, используя команду Client URL в терминале.

Ruby-Doc.org — отличный ресурс для изучения всех объектов Ruby.

Захватите его следующим образом.

➜  ~ curl 'https://ruby-doc.org'
Войти в полноэкранный режим Выход из полноэкранного режима

Здорово видеть, как HTML появляется в терминале, но еще лучше, когда он возвращается в виде объекта Ruby, чтобы мы могли использовать данные. Для этого давайте воспользуемся Nokogiri!

# You'll need the open-uri gem in addition to Nokogiri
# Open-uri allows you to open a URI as if it was a file in Ruby

>> require 'nokogiri'
=> true
>> require 'open-uri'
=> true

>> doc = Nokogiri::HTML5(URI.open('https://ruby-doc.org'))
=>
#(Document:0x9998 {
...
>>
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь мы можем использовать метод #css для запроса html по элементам и классам.

>> puts doc.css('h1')
<h1><a href="/">Ruby-Doc.org</a></h1>
=> nil
>> puts doc.css('p').first
<p>Help and documentation for the Ruby programming language.</p>
Вход в полноэкранный режим Выйти из полноэкранного режима

Запросите класс таким образом.

>> rails = Nokogiri::HTML5(URI('https://rubyonrails.org'))
=>
#(Document:0x1f1bc {
...
>> headline = rails.css('div.heading__headline')
=> [#<Nokogiri::XML::Element:0x1fb94 name="div" attributes=[#<Nokogiri::XML...
>> puts headline.text

        Compress the complexity of modern web apps.
        Learn just what you need to get started, then keep leveling up as you go. Ruby on Rails scales from HELLO WORLD to IPO.

        Youre in good company.
        Over the past two decades, Rails has taken countless companies to millions of users and billions in market valuations.

        Building it together.

        Over six thousand people have contributed code to Rails, and many more have served the community through evangelism, documentation, and bug reports. Join us!

        Everything you need.
        Rails is a full-stack framework. It ships with all the tools needed to build amazing web apps on both the front and back end.

        Optimized for happiness.

        Lets get started.
Войти в полноэкранный режим Выйти из полноэкранного режима

Отлично! Теперь у вас есть общее представление о том, как работает Nokogiri!

А теперь бесплатный бонусный контент…

Давайте выполним поиск по содержимому веб-страницы. Например, сейчас идет сезон баскетбола, поэтому давайте посмотрим, рассказывает ли главная страница ESPN о баскетболе.

>> espn = Nokogiri::HTML5(URI('https://www.espn.com'))
=>
#(Document:0x259e0 {
...
# For this we will use a Regular Expression (RegEx)
# The Regular Expression goes between forward slashes
# And the 'i' flag makes the search case-insensitive
>> espn.text.scan(/basketball/i).count
=> 32
Войдите в полноэкранный режим Выйти из полноэкранного режима

Вот и все! И нам даже не пришлось заходить на сайт, чтобы узнать, что ESPN упоминает баскетбол 32 раза на своей домашней странице! Ничего себе…

Оцените статью
Procodings.ru
Добавить комментарий