2009-08-07 3 views
2

Мне нужна помощь при анализе текста в Ruby.Как удалить URL из текста?

Дано:

@BreakingNews: Тайфун Моракот хитов Тайвань, Китай эвакуирует тысячи http://news.bnonews.com/u4z3

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

@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands 

ответ

1
foo = "@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3" 
r = foo.gsub(/http:\/\/[\w\.:\/]+/, '') 
puts r 
# @BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands 
-1

Это может быть сделано в быстрой и грязной дороге или сложным способом. Я показываю сложный способ:

require 'rubygems' 
require 'hpricot' # you may need to install this gem 
require 'open-uri' 

## first getting the embeded/framed html file's url 
start_url = 'http://news.bnonews.com/u4z3' 
doc = Hpricot(open(start_url)) 
news_html_url = doc.at('//link[@href]').to_s.match(/(http[^"]+)/) 

## now getting the news text, its in the 3rd <p> tag of the framed html file 
doc2 = Hpricot(open(news_html_url.to_s)) 
news_text = doc2.at('//p[3]').to_plain_text 
puts news_text 

Постарайтесь понять, что делает код на каждом шагу. И применяйте знания в своих будущих проектах. Возьмите помощь от этих страниц:

http://wiki.github.com/why/hpricot/an-hpricot-showcase

http://code.whytheluckystiff.net/doc/hpricot/

+1

Это не кажется вы читаете этот вопрос вообще. – hobodave

+0

@hobodave: Я попробовал еще раз, и на этот раз, похоже, я неправильно понял вопрос в последний раз. Я предположил, что был задействован плохой английский, и он хочет получить текст из этой ссылки. Я прошу прощения за это. Довольно простая проблема. –

+0

hpricot больше не рекомендуется. Я бы предложил использовать Nokogiri, который является стандартом де-факто и короткой рукой hpricot поддержки. –

1

Это старый, но хорошо, вопрос. Вот ответ, который опирается на Руби встроенный в URI:

require 'set' 
require 'uri' 

text = '@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3' 

schemes_regex = /^(?:#{ URI.scheme_list.keys.join('|') })/i 

URI.extract(text).each do |url| 
    text.gsub!(url, '') if (url[schemes_regex]) 
end 

puts text.squeeze(' ') 

и прошел через IRB, показывая, что происходит, и полученный результат:

Я определил текст для поиска:

irb(main):004:0* text = '@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3' 
=> "@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3" 

Я определил регулярное выражение схем URI, на которые мы хотим реагировать. Это оборонительный ход, потому что URI возвращает ложноположительный в шаге поиска:

irb(main):006:0* schemes_regex = /^(?:#{ URI.scheme_list.keys.join('|') })/i 
=> /^(?:FTP|HTTP|HTTPS|LDAP|LDAPS|MAILTO)/i 

Пусть URI ходить по тексту находя URL. Для каждого найденного, если это схема, мы хотим, чтобы реагировать на Зачистите все его вхождения из текста:

irb(main):008:0* URI.extract(text).each do |url| 
irb(main):009:1* text.gsub!(url, '') if (url[schemes_regex]) 
irb(main):010:1> end 

Эти URL-адреса URI.extract найдено. Он ошибочно сообщает BreakingNews: из-за отставания :. Я думаю, что это не слишком сложное, но для обычного использования, это хорошо:

=> ["BreakingNews:", "http://news.bnonews.com/u4z3"] 

Показать, что полученный текст был:

irb(main):012:0* puts text.squeeze(' ') 
@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands 
Смежные вопросы