Как мне удалить URL из текста? - PullRequest
2 голосов
/ 07 августа 2009

Мне нужна помощь в разборе текста в Ruby.

Дано:

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

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

@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands

Ответы [ 3 ]

1 голос
/ 02 октября 2012

Это старый, но хороший вопрос. Вот ответ, основанный на встроенном URI в Ruby:

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 
1 голос
/ 07 августа 2009
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 
0 голосов
/ 07 августа 2009

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

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/

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