Использование Ruby's Anemone Gem для очистки всех адресов электронной почты с сайта

Я пытаюсь очистить все адреса электронной почты на данном сайте, используя один файл Ruby-скрипт. В нижней части файла у меня есть жестко заданный контрольный пример с URL-адресом, на котором указан адрес электронной почты, указанный на этой конкретной странице (поэтому он должен найти адрес электронной почты на первой итерации первого цикла.

По некоторым причинам, мое регулярное выражение, кажется, не соответствует:

#get_emails.rb
require 'rubygems'
require 'open-uri'
require 'nokogiri'
require 'mechanize'
require 'uri'
require 'anemone'

class GetEmails

  def initialize
      @urlCounter, @anemoneCounter  = 0
      $allUrls, $emailUrls, $emails = []
  end


  def has_email?(listingUrl)
   hasListing = false
   Anemone.crawl(listingUrl) do |anemone|
      anemone.on_every_page do |page|
      body_text = page.body.to_s
      matchOrNil = body_text.match(/\A[^@\s]+@[^@\s]+\z/)
       if matchOrNil != nil
        $emailUrls[$anemoneCounter] = listingUrl
        $emails[$anemoneCounter] = body_text.match
        $anemoneCounter += 1
        hasListing = true
      else 
      end
    end
   end
   return hasListing
  end

end 

emailGrab = GetEmails.new()
emailGrab.has_email?("http://genuinestoragesheds.com/contact/")
puts $emails[0]

2 ответа

Решение

\A а также \z в вашем матче начало и конец строки соответственно. Очевидно, что эта веб-страница содержит больше, чем просто строку электронной почты, иначе вы не будете тестировать регулярные выражения вообще.

Вы можете упростить это до просто /[^@\s]+@[^@\s]+/, но вам все равно нужно очистить строку, извлекая письмо.

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

#get_emails.rb
require 'rubygems'
require 'open-uri'
require 'nokogiri'
require 'mechanize'
require 'uri'
require 'anemone'

class GetEmails

  def initialize
      @urlCounter = 0
      $anemoneCounter  = 0
      $allUrls = []
      $emailUrls = []
      $emails = []
  end

  def email_clean(email)
    email = email.gsub(/(\w+=)/,"")  
    email = email.gsub(/(\w+:)/, "")
    email = email.gsub!(/\A"|"\Z/, '')
    return email
  end


  def has_email?(listingUrl)
   hasListing = false
   Anemone.crawl(listingUrl) do |anemone|
      anemone.on_every_page do |page|
      body_text = page.body.to_s
      #matchOrNil = body_text.match(/\A[^@\s]+@[^@\s]+\z/)   
      matchOrNil = body_text.match(/[^@\s]+@[^@\s]+/)
       if matchOrNil != nil
        $emailUrls[$anemoneCounter] = listingUrl
        $emails[$anemoneCounter] = matchOrNil
        $anemoneCounter += 1
        hasListing = true
      else 
      end
    end
   end
   return hasListing
  end

end 

emailGrab = GetEmails.new()
found_email = "href=\"mailto:genuinestoragesheds@gmail.com\""
puts emailGrab.email_clean(found_email)
Другие вопросы по тегам