Как найти значение элемента href в теге "<a>" с помощью ruby - PullRequest
0 голосов
/ 05 апреля 2011

Моя цель - найти первый результат в результатах поиска Google и собрать ссылку на сайт, поэтому я построил этот скрипт:

require 'hpricot'
require 'open-uri'
require 'mechanize'
query = gets.chomp
agent = Mechanize.new
page = agent.get("http://www.google.co.il/")
search_form = page.form_with(:name => "f")
search_form.field_with(:name => "q").value = query.to_s
search_results = agent.submit(search_form)
search_results = search_results.body
doc = Hpricot(search_results)
site = doc.search("a")[16,1]
url = site.to_s
puts url

Я получаю строку, подобную этой:

url = <a href="http://en.wikipedia.org/wiki/Gallon" dir="ltr" class="l"><em>Gallon</em> - Wikipedia, the free encyclopedia</a>

Но мне нужна только ссылка (http://en.wikipedia.org/wiki/Gallon) не весь HTML-код ... Как я могу это сделать? Я использую драгоценные камни:

require 'hpricot'
require 'open-uri'
require 'mechanize'

Ответы [ 6 ]

6 голосов
/ 05 апреля 2011

Вы можете получить значение атрибутов , как это

(doc/"a")[16].attributes['href']

но я должен сказать, что магическое число 16 кажется хрупким.

Вы также не должны просматривать результаты поиска, вам следует рассмотреть возможность использования API пользовательского поиска .

6 голосов
/ 05 апреля 2011

Поскольку механизация включает в себя нокогири, вы можете должны вообще пропустить hpricot. Это замедлит ваш код без необходимости. Вы фактически делаете одно и то же дважды.

require 'mechanize'
query = gets.chomp
agent = Mechanize.new
page = agent.get("http://www.google.co.il/")
search_form = page.form_with(:name => "f")
search_form.field_with(:name => "q").value = query.to_s
search_results = agent.submit(search_form)

puts search_results.links[16].href
1 голос
/ 05 апреля 2011

Вместо преобразования в строку с url = site.to_s do url = site[0].attributes['href']

0 голосов
/ 05 апреля 2011

Поскольку ввод всегда будет следовать одному и тому же формату, вы можете просто сделать:

url.split("href=\"").last.split("\"").first
0 голосов
/ 05 апреля 2011

Waitir - разумный выбор для проверки макета веб-страницы.

require 'rubygems'
require 'watir'

#Launching browser windows and navigating to google
browser = Watir::Browser.new
browser.goto("http://www.google.co.il/")

#Logging to console if a link with href = http://en.wikipedia.org/wiki/Gallon present
puts browser.link(:href, "http://en.wikipedia.org/wiki/Gallon").exists?
0 голосов
/ 05 апреля 2011

попробуйте использовать:

site = doc.search("a[@href]")[16,1]
...