Как учесть несколько строк при выполнении string.scan - PullRequest
0 голосов
/ 10 февраля 2012

Вот выдержка из HTML, которую я хочу просмотреть.

<div class="text">
 <h3>
  <a href="http://www.faith.co.uk/">
   Rodeo Sinclair
  </a>
 </h3>

А вот мой рубиновый код.

@doc = open(url) { |f| 
  @doc = f.read
}

output = @doc.scan(/<h3><a href=(.*?)>/) 

Это не работает из-за новых строк и пробелов в html-файле. Есть ли в любом случае я могу обойти это?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Я мог бы легко создать регулярное выражение, которое будет анализировать ваш HTML-фрагмент.

Однако я хотел бы призвать вас привыкнуть использовать синтаксический анализатор XML / HTML для взаимодействия с HTML.

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open(url))

output = doc.css('div h3 a').each do |link|
    puts link.attr("href")
end

См. RegEx соответствует открытым тегам, за исключением автономных тегов XHTML для убедительного аргумента против использования регулярных выражений для анализа HTML.

== EDIT == изменено накаждый цикл

1 голос
/ 10 февраля 2012

Добавить (необязательно) пробелы к совпадению:

@doc.scan(/<h3>\s*<a href=(.*?)>/) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...