Удаление результатов с сайта, который не имеет разных URL - PullRequest
0 голосов
/ 28 ноября 2011

Я пытаюсь автоматизировать процесс поиска альтернативных телефонных номеров, используя SayNoTo0870 .Каждый раз, когда кто-то ищет альтернативный номер или имя, он открывает страницу '/companysearch.php'.

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

То, что я надеюсь сделать, это использовать приведенный ниже код, чтобы автоматизировать открытие браузера, поиск имени / номера, удаление HTML-кода и предоставление 5 лучших результатов.У меня отключена часть автоматизации, но, очевидно, что при попытке сохранить веб-страницу с помощью Hpricot она вызывает только страницу «Извините, ничего не может быть найдено», потому что я не могу напрямую связать страницу результатов поиска.

Вот мой код: (я удалил комментарии, чтобы сократить его)

require 'rubygems'
require 'watir'
require 'hpricot'
require 'open-uri'



class OH870


    def searchName(name)
        browser = Watir::Browser.new
        browser.goto 'http://www.saynoto0870.com/search.php'
        browser.text_field(:name => 'search_name').set name
        browser.button(:name => 'submit').click
    end 

    def searchNumber(number)

        browser = Watir::Browser.new
        browser.goto 'http://www.saynoto0870.com/search.php'
        browser.text_field(:name => 'number').set number
        browser.button(:name => 'submit').click
    end 

    def loadNew(website)

        doc = Hpricot(open(website))
        puts(doc)   

    end


    def strip_tags
        stripped = website.gsub( %r{</?[^>]+?>}, '' )
        puts stripped
    end

end # class

class Main < OH870
puts "What is the name of the place you want?" 
website = 'http://www.saynoto0870.com/companysearch.php'

    question = gets.chomp
    whichNumber = OH870.new
    whichNumber.searchName(question)
    #result = OH870.new
    #withoutTags = website.strip_tags
    #result.loadNew(withoutTags)
end

Теперь я не уверен, есть ли способ «попросить watir перейти на страницу companysearch.php»и вывести результаты без необходимости передавать эту страницу как переменную.

Интересно, есть ли у кого-нибудь какие-либо предложения здесь?

1 Ответ

2 голосов
/ 28 ноября 2011

С WATIR, за исключением посторонних библиотек, вот все, что нужно, чтобы выполнить то, что вы описали (используя только контрольный пример 'name').Я вытащил его из формата функции, так как вы уже знаете, как это сделать, и это будет более понятный путь для контрольного примера.

require 'watir'

@browser = Watir::Browser.new :firefox   #open a browser called @browser

@browser.goto "http://(your search page here)"         #go to the search page
@browser.text_field(:name => 'name').value = "Awesome" #fill in the 'name' field
@browser.button(:name => 'submit').click               #submit the form

Если все пойдет хорошо, теперь мы должны рассмотретьрезультаты поиска.WATIR уже знает, что это на новой странице - нам не нужно указывать URL.В случае, если результаты находятся во фрейме, нам нужно получить доступ к этому фрейму, прежде чем мы сможем просмотреть его содержимое.Давайте представим, что они находятся в элементе DIV с идентификатором «search_results»:

results = @browser.div(:id => "search_results").text

resultsFrame = @browser.frame(:index => 1)                #in the case of a frame
results = resultsFrame.div(id => "search_results).text

Как видите, вам не нужно сохранять всю страницу для анализа результатов.Они могут находиться в ячейках таблицы, они могут быть в другом элементе div на строку или в новом фрейме.Все они легко доступны с помощью WATIR для хранения в переменной, массиве или немедленной записи в консоль или файл журнала.

@results = Array.new                #create an Array to store our results

@browser.divs.each do |div|         #for each div element on the page
   if div.id == "search_results"    #if the div ID equals "search_results"
      @results << div.text          #add it to our array named @results
   end
end

Теперь, если вы просто хотели получить верхнюю 5 , есть много способов.чтобы получить к ним доступ .

@results[0]      #first element
@results[0..4]   #first 5 elements

Я бы также предложил вам изучить несколько принципов программирования, таких как СУХОЙ (не повторяйте себя).В ваших определениях функций, где вы видите, что они совместно используют код, например, открывают браузер и посещают один и тот же URL-адрес, вы можете объединить их:

def search(how, what)
  @browser = Watir::Browser.new :firefox
  @browser.goto "(that search url again)"
  @browser.text_field(:name => how).value = what
  etc...
end

search("name", "Hilton")
search("number", "555555")

Поскольку мы знаем, что два доступных имени text_field - это «name» и«число», и они имеют логический смысл как «как», мы можем их параметризовать и использовать одну функцию для тестовых случаев «Поиск по имени» и «Поиск по номеру».Это более эффективно, если тестовые примеры остаются достаточно схожими для совместного использования.

...