Разбор текста для поиска html-тегов в Ruby 1.9.x

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

Скажем, у меня есть этот блок текста в переменной с именем «текст»:

some text some text some text some text some text
<some_tag>
  some text some text some text some text some text
</some_tag>
some text some text some text some text some text

Я хочу проанализировать содержимое «текст», ничего не делая, пока не найдет открывающий тег, в данном случае «some_tag», и как только он найдет открывающий тег, я хочу, чтобы он зафиксировал все, пока тег не закроется.

Я уже около часа возился с блоками и регулярными выражениями и не могу найти хороший способ решить эту проблему.

Я был бы признателен за любые указатели, спасибо!


person Ben    schedule 08.03.2011    source источник


Ответы (1)


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

Используя Nokogiri:

require 'nokogiri'

html = <<EOT
some text some text some text some text some text
<p>
  some text some text some text some text some text
</p>
some text some text some text some text some text
EOT

doc = Nokogiri::HTML::DocumentFragment.parse(html)

puts doc.search('p').map { |n| n.inner_text }

>>   some text some text some text some text some text

Это поиск по фрагменту HTML, поиск тегов <p>. Для каждого найденного он будет извлекать внутренний текст.

Я использую режим CSS Nokogiri, используя "p". Вместо этого я мог бы использовать XPath, но CSS понимает больше людей.

person the Tin Man    schedule 08.03.2011
comment
Спасибо, я просматривал Nokogiri несколько раз, но пока нашел документацию очень плохой. Но это только то, что я видел прямо с сайта nokogiri.org. У вас есть хорошие ссылки на него? Спасибо! - person Ben; 08.03.2011
comment
@Rhinoo, документы не так уж плохи. По крайней мере, они у них есть, а это больше, чем в некоторых основных библиотеках Ruby. Лучше всего прочитать их учебные пособия, изучить все документы на их сайте, а затем также поискать интересные темы в списке рассылки Nokokiri-Talk. Их список рассылки является их основной поддержкой и местом, которое отслеживают разработчики, поэтому вы получите действительно хорошие примеры того, как что-то делать, прямо от людей, которые знают это лучше всего. - person the Tin Man; 08.03.2011
comment
@Rhinoo, если это ответило на ваш вопрос, обязательно отметьте ответ. Спасибо. - person the Tin Man; 08.03.2011