2012-03-02 26 views
14

tôi có thể nhận được một chuỗi trong bất kỳ các định dạng:Phân tích hostname và cổng từ chuỗi hoặc url

Tôi muốn trích xuất máy chủ và nếu có cổng. Nếu giá trị cổng không xuất hiện, tôi muốn đặt giá trị mặc định là 80.

Tôi đã thử urlparse, hoạt động tốt cho url, nhưng không phù hợp với định dạng khác. Khi tôi sử dụng urlparse trên tên máy chủ: cổng ví dụ, nó đặt tên máy chủ trong lược đồ chứ không phải là netloc.

Tôi sẽ hài lòng với giải pháp sử dụng urlparse và regex hoặc một regex đơn có thể xử lý cả hai định dạng.

+0

gì đang regex Bạn đã thử? nếu không regex mã bạn đã viết là gì? –

Trả lời

2

Tôi không phải là quen thuộc với urlparse, nhưng sử dụng regex bạn muốn làm điều gì đó như:

p = '(?:http.*://)?(?P<host>[^:/ ]+).?(?P<port>[0-9]*).*' 

m = re.search(p,'http://www.abc.com:123/test') 
m.group('host') # 'www.abc.com' 
m.group('port') # '123' 

Hoặc, mà không có cổng:

m = re.search(p,'http://www.abc.com/test') 
m.group('host') # 'www.abc.com' 
m.group('port') # '' i.e. you'll have to treat this as '80' 

EDIT: cố định regex cũng để phù hợp ' www.abc.com 123'

+0

Cảm ơn điều này có vẻ thực sự hữu ích. – TonyM

+2

Tôi giả sử các phiếu giảm giá là vì giải pháp này quá phức tạp. Tôi chấp nhận điều đó và đồng ý với @ntziolis khi nói rằng bạn nên cố gắng sử dụng chức năng tiêu chuẩn khi có thể. – claesv

+0

Url chuẩn không hoạt động cho chuỗi (không bắt đầu bằng http (s) hoặc //) vì vậy giải pháp này có vẻ hữu ích. Tại sao downvote mà không giải thích. –

7

lý do nó không cho:

www.acme.com 456 

là vì đó không phải là URI hợp lệ. Tại sao bạn không chỉ:

  1. Thay thế vào khoảng trống bằng :
  2. Phân tích chuỗi kết quả bằng cách sử dụng các tiêu chuẩn urlparse phương pháp

Cố gắng và tận dụng các chức năng mặc định càng nhiều càng tốt, đặc biệt là khi nói đến những thứ như phân tích cú pháp cũng biết các định dạng như URI.

+2

Khi tôi sử dụng urlparse trên máy chủ: cổng nó đặt tên máy chủ trong lược đồ chứ không phải là netloc. – TonyM

+2

Từ hướng dẫn sử dụng: "Theo các đặc tả cú pháp trong RFC 1808, urlparse chỉ nhận dạng netloc nếu nó được giới thiệu bởi‘ // ’. Nếu không thì đầu vào được coi là URL tương đối và do đó bắt đầu với thành phần đường dẫn." – ntziolis

+1

Để giải quyết vấn đề này, chỉ cần tiền tố nó bằng '//' hoặc 'http: //' trước khi phân tích cú pháp – ntziolis

31

Bạn có thể sử dụng để có được urlparse hostname từ chuỗi URL:

from urlparse import urlparse 
print urlparse("http://www.website.com/abc/xyz.html").hostname # prints www.website.com 
4
>>> from urlparse import urlparse 
>>> aaa = urlparse('http://www.acme.com:456') 

>>> aaa.hostname 
'www.acme.com' 

>>> aaa.port 
456 
>>> 
Các vấn đề liên quan