2010-09-08 38 views
15

Wie extrahiere ich alle URLs aus einer Nur-Text-Datei in Ruby?So extrahieren Sie URLs aus dem Text

Ich habe versucht, einige Bibliotheken, aber sie scheitern in einigen Fällen. Was ist der beste Weg?

+4

Welche Bibliotheken haben Sie ausprobiert und auf welche Weise scheitern sie? – Zaz

+0

Wenn Sie eine solche Frage stellen, erwarten wir, dass Sie versuchen, das Problem zu lösen. Wir helfen Ihnen gerne dabei, Ihren Code zu reparieren, aber uns zu bitten, Code für Sie zu schreiben, gehört nicht zum Thema. Bitte lesen Sie "[fragen]" und "[mcve]". –

Antwort

4

Welche Fälle versagen?

Nach der Bibliothek regexpert können Sie

regexp = /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix 

verwenden und dann eine scan auf den Text durchzuführen.

EDIT: Scheint wie die Regexp die leere Zeichenfolge unterstützt. Entfernen Sie einfach die anfängliche (^$) und Sie

+1

Interessant, wie diese Regex schlägt fehl, wenn die URL eine IP-Adresse ist – NullUserException

+1

Ja. Ich habe Ihre Antwort wegen der "Abstimmung und Abstimmung auf Ihre Bedürfnisse" gewählt. Es scheitert auch, wenn ein Benutzer @ Passwort, oder andere als https ?, oder eine andere seltsame Situation. Sie würden wahrscheinlich nicht http://tools.ietf.org/html/rfc3986 lesen wollen, um loszulegen -_- – Chubas

+0

Es schlägt wie oben. Ich frage hier, warum ich nicht in der Lage bin "und es nach Ihren Bedürfnissen anzupassen". – tapioco123

7

Sie regex verwenden können und .scan()

string.scan(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/) 

können Sie mit dieser Regex loszulegen und passen sie nach Ihren Bedürfnissen.

82

Wenn Sie fertig wie mit, was bereits für Sie in Ruby zur Verfügung gestellt hat:

require "uri" 
URI.extract("text here http://foo.example.org/bla and here mailto:[email protected] and here also.") 
# => ["http://foo.example.org/bla", "mailto:[email protected]"] 

Lesen Sie mehr: http://railsapi.com/doc/ruby-v1.8/classes/URI.html#M004495

+4

Es schlägt auf Text mit ":" http: //blog.apptamers fehl.com/post/48613650042/uri-extract-incorrect-in-ruby-1-9-3 –

+9

'URI.extract (IhreString,/http (s)? | mailto /)' – titibouboul

+4

Gibt es trotzdem, URLs ohne Schema zu extrahieren? wie www.example.com –

10

Ich habe verwendet twitter-text gem

require "twitter-text" 
class UrlParser 
    include Twitter::Extractor 
end 

urls = UrlParser.new.extract_urls("http://stackoverflow.com") 
puts urls.inspect 
0
require 'uri'  
foo = #<URI::HTTP:0x007f91c76ebad0 URL:http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg> 
foo.to_s 
=> "http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg" 

bearbeiten: Erklärung

Für diejenigen, die Probleme haben, URIs durch JSON-Antworten zu analysieren oder ein Scraping-Tool wie Nokogiri oder Mechanize zu verwenden, funktionierte diese Lösung für mich.

+0

Vielleicht sollten Sie Ihre Antwort erklären? Wenn es tatsächlich eine Antwort ist? – Jensd

+0

Zusätzliche Erklärung hinzugefügt. – Keon

+0

Dies ergibt keinen Sinn und ist nicht syntaktisch korrekt. –

0

Wenn Sie Ihre Eingabe in etwa so aussieht:

"http://i.imgur.com/c31IkbM.gifv;http://i.imgur.com/c31IkbM.gifvhttp://i.imgur.com/c31IkbM.gifv" 

dh URLs müssen nicht weißen Raum um sie herum haben, können durch ein beliebiges Trennzeichen begrenzt werden, oder haben keine Trennzeichen zwischen ihnen überhaupt, können Sie mit dem folgender ansatz:

def process_images(raw_input) 
    return [] if raw_input.nil? 
    urls = raw_input.split('http') 
    urls.shift 
    urls.map { |url| "http#{url}".strip.split(/[\s\,\;]/)[0] } 
end 

Hoffe es hilft!

Verwandte Themen