× Темы

Email parser Nokogiri ruby

+1

Email parser Nokogiri ruby

Сегодня мы напишем парсер имейлов с использование Nokogiri. Это практическая статья, на тему регулярные выражения. Я продемонстрирую как написать простой парсер имейлов на Ruby on Rails.

Приступим, нам понадобиться контроллер для обработки запроса и форма отправляющая методом get url сайта, где будет происходить поиск. Шаблон для поиска емейла создадим используя регулярное выражение.

Создадим новое приложение и перейдем в папку
$ rails new parser && cd parser


Добавим в gemfile наш nokogiri gem
gem 'nokogiri'


Выполним установку nokogiri в проект
$ bundle install 


Создадим контроллер
$ rails g controller Parser index


Откроем код с нашим контроллером

#app/controllers/parser_controller.rb
class ParserController < ApplicationController

# для получения контента через http
require 'open-uri'
     
# подключаем Nokogiri
require 'nokogiri' 

  def index
    url = params[:url].strip!
    regular = /[-\w.]+@+[A-z]{2,8}+\.[A-z]{2,4}+/

    # ленивая инициализация если url не присвоено значение, то присваивает 'http://vk.com', иначе нечего не происходит!
    url ||= 'http://vk.com'
     
    @doc = Nokogiri::HTML(open(url)).to_s.scan(regular)    
  end

end



В контроллере получаем ссылку на сайт из формы в views . Объявляем регулярное выражение для поиска емейлов. В конце этой статьи я приложу самые популярные шаблоны регулярных выражений.
С помощью nokogiri и open-uri получаем html код со страницы, преобразовываем полученный тип данных в строку, далее с помощью метода #scan делаем выборку по шаблону. Где шаблон как раз регулярное выражение.

Создадим нашу форму где будем отправлять ссылку в контроллер, а затем получим найденный список.

<!-- app/views/index.html.erb -->
<p>Пример: http://aim-online.wen.ru/aim/baza.txt </p>

<%= form_tag("/parser/index", method: "get") do %>
  <%= label_tag(:url, "Введите ссылку для поиска email:") %>
  <%= text_field_tag(:url) %>
  <%= submit_tag("Search") %>
<% end %>


<h2>Список найденных имейлов:</h2>
<ol>
<% @doc.each do |email| %>
  <li><%= email %></li> <br>
<% end %>
</ol>


Для создания формы, пользуемся методом хелпером form_tag. С аргументами: путь к экшену и указанием метода get. Далее отправим хеш params, где ключом будет :url а значение - наше введенное сообщение.

Демо

Полезные шаблоны регулярных выражений:

Номер кредитки:
 [0-9]{13,16}

ICQ:
([1-9])+(?:-?\d){4,}

Домен (например abcd.com):
 ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$

IPv4:
((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)

IPv6:
((^|:)([0-9a-fA-F]{0,4})){1,8}$

Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, первый символ обязательно буква):
^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$

Пароль (Строчные и прописные латинские буквы, цифры):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$

Дата в формате DD/MM/YYYY:
 (0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d

E-mail:
^[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$

 [-\w.]+@+[A-z]{2,8}+\.[A-z]{2,4}+

Mac-адрес:
([0-9a-fA-F]{2}([:-]|$)){6}$|([0-9a-fA-F]{4}([.]|$)){3}


Ну и напоследок пока, что ни у кого не получилось составить регулярное выражение, которое бы могло проверять e-mail на валидность. Все из-за того, что описать RFC слишком сложно и поэтому самая простая проверка на валидность - отправка письма на почту. Для этого можно использовать как вариант gem pony.

P. S. Не используйте регулярные выражения для проверки валидности email пользователя. Правильный способ
Nokogiri умеет искать по регулярным выражениям. Использование этого избавило бы от приведения к типу данных строка, что в случае больших объемов данных может быть важным.
#todo В ближайшем будущем исправлю этот момент.все для dleфильмы и сериалы онлайн hdавтоматический обмен webmoney на приват24android игры, приложения, инструкции, обзоры



Оценить статью