Эти ссылки на самом деле имеют class=l
, а не class="l"
. Кстати, чтобы понять это, я добавил в метод некоторую регистрацию, чтобы вы могли видеть результаты на разных этапах и отлаживать их. Я искал строку, которую вы ожидали найти, и не нашел ее, поэтому ваше регулярное выражение не удалось. Поэтому я искал правильную строку, которую вы на самом деле хотели, и соответственно изменил регулярное выражение. Навыки отладки удобны.
require "open-uri"
url = "http://www.google.com/search?q=ruby"
source = open(url).read
puts "--- PAGE SOURCE ---"
puts source
links = source.scan(/<a.+?href="(.+?)".+?class=l/)
puts "--- FOUND THIS MANY LINKS ---"
puts links.size
puts "--- PRINTING LINKS ---"
links.each do |link|
puts "- #{link}"
end
Я также улучшил ваше регулярное выражение. Вы ищете некоторый текст, который начинается с открытия тега (<a
), затем некоторые символы, которые вас не интересуют (.+?
), атрибут href (href="
), содержимое атрибут href, который вы хотите захватить ((.+?)
), некоторые пробелы или другие атрибуты (.+?
) и, наконец, атрибут attrubute класса (class=l
).
У меня есть .+?
в трех местах. .
означает любой символ, +
означает, что перед ним должна быть одна или несколько вещей, а ?
означает, что .+
должен пытаться найти максимально короткую строку.