ruby regex, разбор html - PullRequest
       20

ruby regex, разбор html

2 голосов
/ 03 апреля 2010

Я пытаюсь проанализировать некоторые возвращенные HTML (от http://www.google.com/movies?near=37130), чтобы найти фильмы, которые воспроизводятся в данный момент. Шаблон, который я пытаюсь найти, выглядит так:
<span dir=ltr>Clash of the Titans</span>

Из которых есть несколько в возвращенном HTML.

Я пытаюсь получить массив названий фильмов с помощью следующей команды:
titles = listings_html.split(/(<span dir=ltr>).*(<\/span>)/)

Но я не получаю ожидаемых результатов. Кто-нибудь может увидеть проблему с моим подходом или регулярным выражением?

Ответы [ 4 ]

5 голосов
/ 03 апреля 2010

Вери считается плохим, как правило, для анализа HTML с RegExs, так как HTML не имеет регулярной грамматики. Смотрите список ссылок на объяснения (некоторые из SO) здесь .

Вместо этого следует использовать указанную библиотеку HTML, , например, такую ​​

4 голосов
/ 03 апреля 2010

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

<span>.*</span>

Это регулярное выражение соответствует <span>hello</span> правильно, но не соответствует <span>hello</span><span>there</span> и соответствует всей строке. Помните, что оператор * является жадным, поэтому он будет соответствовать самой длинной возможной строке. Вы можете сделать его не жадным, используя .*?, чтобы оно заработало.

Однако для анализа HTML-кода нецелесообразно использовать регулярные выражения.

1 - Вы не можете всегда анализировать HTML с помощью регулярных выражений. HTML не является регулярным.

2- Очень сложно писать или поддерживать регулярные выражения.

3- Легко сломать регулярное выражение, используя такие данные, как <span><a href="</span>"></a></span>.

3 голосов
/ 03 апреля 2010

Для разбора HTML с Ruby используйте Nokogiri или hpricot .

2 голосов
/ 03 апреля 2010

(не похоже, что образец HTML, который вы опубликовали, на самом деле содержит примеры шаблона, который вы пытаетесь найти.)

Алисия права, что регулярное выражение против html, как правило, плохая идея, и по мере усложнения ваших требований оно будет нарушено.

Тем не менее, ваш пример довольно прост ..

doc.scan(/<span dir=ltr>(.*)<\/span/) do |match|
   puts match               
end 

Как уже упоминалось,. * Обычно жадный (и я ожидал, что это придется учитывать), но, похоже, при использовании в сканировании вы не получаете жадного поведения. Мне удалось сопоставить несколько из этих шаблонов в одном документе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...