2010-09-08 4 views
15

Comment puis-je extraire toutes les URL d'un fichier texte brut dans Ruby?Comment extraire des URL à partir du texte

J'ai essayé certaines bibliothèques mais elles échouent dans certains cas. Quelle est la meilleure façon?

+4

Quelles bibliothèques avez-vous essayées, et en quoi échouent-elles? – Zaz

+0

Lorsque vous posez une question comme celle-ci, nous nous attendons à voir votre tentative de résoudre le problème. Nous sommes heureux de vous aider à corriger votre code, mais nous demander d'écrire du code pour vous est hors sujet. Veuillez lire "[ask]" et "[mcve]". –

Répondre

4

Quels cas ont échoué?

Selon la bibliothèque regexpert, vous pouvez utiliser

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

puis effectuez une scan sur le texte.

EDIT: On dirait que l'expression rationnelle prend en charge la chaîne vide. Il suffit de retirer la première (^$) et vous avez terminé

+1

Intéressant comment cette expression régulière échoue quand l'URL est une adresse IP – NullUserException

+1

Yep. J'ai effectivement voté sur votre réponse à cause du "et l'ajuster en fonction de vos besoins". Il échoue également lorsqu'il présente un utilisateur @ mot de passe, ou en utilisant autre que https ?, ou toute autre situation étrange. Vous ne voudrez probablement pas lire http://tools.ietf.org/html/rfc3986 pour commencer -_- – Chubas

+0

Il échoue comme ci-dessus. Je demande ici juste pourquoi je suis incapable de "et l'ajuster selon vos besoins". – tapioco123

7

Vous pouvez utiliser regex et .scan()

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

Vous pouvez commencer avec cette expression régulière et l'adapter en fonction de vos besoins.

82

Si vous aimez utiliser ce qui est déjà prévu pour vous dans Ruby:

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]"] 

En savoir plus: http://railsapi.com/doc/ruby-v1.8/classes/URI.html#M004495

+4

Il échoue sur le texte avec ":" http: //blog.apptamers.com/post/48613650042/uri-extrait-incorrect-en-ruby-1-9-3 –

+9

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

+4

Il ya de toute façon pour extraire des URL sans schéma? comme www.example.com –

10

Je l'ai utilisé twitter-text petit bijou

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" 

edit: explication

Pour ceux qui ont des problèmes d'analyse des URI via des réponses JSON ou en utilisant un outil de grattage comme Nokogiri ou Mechanize, cette solution a fonctionné pour moi.

+0

Peut-être devriez-vous expliquer votre réponse? Si c'est en effet une réponse? – Jensd

+0

Explication supplémentaire ajoutée. – Keon

+0

Cela n'a aucun sens et n'est pas syntaxiquement correct. –

0

Si votre entrée ressemble à ceci:

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

-à-dire les URL ne sont pas nécessairement avoir un espace blanc autour d'eux, peut être délimité par un séparateur, ou ne pas avoir delimiter entre eux du tout, vous pouvez utiliser le approche suivante:

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 

Espérons que ça aide!

Questions connexes