2010-09-08 74 views
15

Làm cách nào để trích xuất tất cả URL từ một tệp văn bản thuần túy trong Ruby?Cách trích xuất URL từ văn bản

Tôi đã thử một số thư viện nhưng không thành công trong một số trường hợp. Cách tốt nhất là gì?

+4

Bạn đã thử các thư viện nào và chúng bị lỗi như thế nào? – Zaz

+0

Khi đặt câu hỏi như thế này, chúng tôi hy vọng sẽ thấy nỗ lực của bạn trong việc giải quyết vấn đề. Chúng tôi rất vui được giúp sửa mã của bạn, nhưng yêu cầu chúng tôi viết mã cho bạn là không có chủ đề. Vui lòng đọc "[yêu cầu]" và "[mcve]". –

Trả lời

4

Trường hợp nào bị lỗi?

Theo thư viện regexpert, bạn có thể sử dụng

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

và sau đó thực hiện một scan trên văn bản.

EDIT: Có vẻ như regexp hỗ trợ chuỗi rỗng. Chỉ cần loại bỏ các đầu (^$) và bạn đã hoàn tất

+1

Thú vị như thế nào regex này thất bại khi URL là một địa chỉ IP – NullUserException

+1

Yep. Tôi thực sự đã bỏ phiếu cho câu trả lời của bạn vì "và điều chỉnh nó theo nhu cầu của bạn". Nó cũng không thành công khi trình bày một mật khẩu người dùng @, hoặc sử dụng khác với https ?, hoặc bất kỳ tình huống kỳ lạ nào khác. Có thể bạn sẽ không muốn đọc http://tools.ietf.org/html/rfc3986 để bắt đầu -_- – Chubas

+0

Không thành công như trên. Tôi hỏi tại sao tôi không thể "và điều chỉnh nó theo nhu cầu của bạn". – tapioco123

7

Bạn có thể sử dụng regex và .scan()

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

Bạn có thể bắt đầu với regex đó và điều chỉnh nó theo nhu cầu của bạn.

82

Nếu bạn thích sử dụng những gì đã được cung cấp cho bạn trong 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]"] 

Read more: http://railsapi.com/doc/ruby-v1.8/classes/URI.html#M004495

+4

Không thành công trên văn bản với ":" http: //blog.apptamers.com/post/48613650042/uri-extract-incorrect-in-ruby-1-9-3 –

+9

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

+4

Có cách nào để trích xuất các url không có lược đồ? như www.example.com –

10

Tôi đã sử dụng twitter-text đá quý

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" 

chỉnh sửa: giải thích

Đối với những người đang gặp sự cố khi phân tích cú pháp của URI thông qua phản hồi JSON hoặc bằng cách sử dụng công cụ cào như Nokogiri hoặc Mechanize, giải pháp này làm việc cho tôi.

+0

Có lẽ bạn nên giải thích câu trả lời của mình? Nếu nó thực sự là một câu trả lời? – Jensd

+0

Đã giải thích thêm. – Keon

+0

Điều này không có ý nghĩa và không chính xác về cú pháp. –

0

Nếu đầu vào của bạn trông giống như sau:

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

tức là URL này không nhất thiết phải có khoảng trắng xung quanh họ, có thể được giới hạn bởi bất kỳ dấu phân cách, hoặc không có dấu phân cách giữa họ ở tất cả, bạn có thể sử dụng cách tiếp cận sau:

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 

Hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan