¿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?
¿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?
¿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á
Interesante cómo esta expresión regular falla cuando la dirección URL es una dirección IP – NullUserException
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
No funciona como se indicó anteriormente. Solo estoy preguntando por qué no puedo "y ajustarlo según sus necesidades". – tapioco123
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.
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
Fracasa en el texto con ":" http: //blog.apptamers.com/post/48613650042/uri-extract-incorrect-in-ruby-1-9-3 –
'URI.extract (yourString,/http (s)? | mailto /)' – titibouboul
¿Hay alguna forma de extraer URL sin esquema? como www.example.com –
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
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í.
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!
¿Qué bibliotecas has probado y de qué manera están fallando? – Zaz
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]". –