2 Stimmen

Wie entferne ich URLs aus dem Text?

Ich möchte Hilfe beim Parsen von Text in Ruby.

Gegeben:

@BreakingNews: Taifun Morakot trifft T http://news.bnonews.com/u4z3

Ich möchte alle Hyperlinks entfernen und reinen Text zurückgeben.

@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands

1voto

hobodave Punkte 28128
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

1voto

the Tin Man Punkte 154584

Dies ist eine alte, aber gute Frage. Hier ist eine Antwort, die sich auf den in Ruby eingebauten URI stützt:

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(' ')

Und ein Durchlauf durch IRB, der zeigt, was passiert und was dabei herauskommt:

Ich habe den zu suchenden Text definiert:

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"

Ich habe eine Regex von URI-Schemata definiert, auf die wir reagieren wollen. Dies ist ein defensiver Schritt, da URI in seinem Suchschritt ein falsch-positives Ergebnis liefert:

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

Lassen Sie URI durch den Text gehen, um URLs zu finden. Für jede gefundene, wenn es ein Schema, das wir wollen, um zu reagieren, entfernen Sie alle seine Vorkommen aus dem Text:

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

Dies sind die URLs URI.extract gefunden. Sie meldet fälschlicherweise BreakingNews: wegen der hinteren : . Ich denke, es ist nicht zu anspruchsvoll, aber für den normalen Gebrauch ist es in Ordnung:

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

Zeigen Sie, wie der resultierende Text aussah:

irb(main):012:0* puts text.squeeze(' ')
@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands

-1voto

vulcan_hacker Punkte 116

Dies kann auf schnelle und schmutzige Weise oder auf anspruchsvolle Weise geschehen. Ich zeige hier die ausgeklügelte Methode:

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

Versuchen Sie zu verstehen, was der Code in jedem Schritt tut. Und wenden Sie das Wissen in Ihren zukünftigen Projekten an. Nehmen Sie Hilfe von diesen Seiten:

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X