2010-09-08 28 views
15

¿Cómo extraigo todas las URL de un archivo de texto plano en Ruby?Cómo extraer URL del texto

Probé algunas bibliotecas pero fallan en algunos casos. ¿Cuál es la mejor manera?

+4

¿Qué bibliotecas has probado y de qué manera están fallando? – Zaz

+0

Al hacer una pregunta como esta, esperamos ver su intento de resolver el problema. Nos complace ayudar a reparar su código, pero pedirnos que escriba el código para usted no está relacionado con el tema. Lea "[preguntar]" y "[mcve]". –

Respuesta

4

¿Qué casos están fallando?

De acuerdo con la biblioteca regexpert, puede utilizar

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

y luego realizar una scan en el texto.

EDITAR: Parece que la expresión regular admite la cadena vacía. Basta con retirar la inicial (^$) y ya está

+1

Interesante cómo esta expresión regular falla cuando la dirección URL es una dirección IP – NullUserException

+1

Sí. De hecho, voté por su respuesta debido a "y la ajusto de acuerdo a sus necesidades". También falla al presentar una contraseña de usuario @, o usar otra que no sea https ?, o cualquier otra situación extraña. Probablemente no le gustaría leer http://tools.ietf.org/html/rfc3986 para comenzar -_- – Chubas

+0

No funciona como se indicó anteriormente. Solo estoy preguntando por qué no puedo "y ajustarlo según sus necesidades". – tapioco123

7

Puede utilizar expresiones regulares y .scan()

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

se puede empezar con la expresión regular y ajustar de acuerdo a sus necesidades.

82

Si te gusta usar lo que ya se proporcionan para usted en 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]"] 

Leer más: http://railsapi.com/doc/ruby-v1.8/classes/URI.html#M004495

+4

Fracasa en el texto con ":" http: //blog.apptamers.com/post/48613650042/uri-extract-incorrect-in-ruby-1-9-3 –

+9

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

+4

¿Hay alguna forma de extraer URL sin esquema? como www.example.com –

10

He usado twitter-text joya

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" 

editar: explicación

Para aquellos que están teniendo problemas para analizar URI a través de respuestas JSON o utilizando una herramienta de raspado como Nokogiri o Mechanize, esta solución funcionó para mí.

+0

¿Quizás deberías explicar tu respuesta? Si de hecho es una respuesta? – Jensd

+0

Explicación adicional agregada. – Keon

+0

Esto no tiene sentido y no es sintácticamente correcto. –

0

Si la entrada es similar a esto:

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

es decir, las direcciones URL no necesariamente tienen espacio en blanco alrededor de ellos, pueden ser delimitado por cualquier delimitador, o no tienen ningún delimitador entre ellos en todo, se puede utilizar el siguiente enfoque:

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 

Espero que ayude!