2010-03-21 43 views
22

Trong trăn, làm cách nào để kiểm tra xem url có kết thúc bằng .jpg không?python: kiểm tra xem url có tồn tại jpg không.

ví dụ: http://www.fakedomain.com/fakeImage.jpg

nhờ

+1

Vui lòng cung cấp chi tiết bằng cách chỉnh sửa mô tả câu hỏi để giải quyết các điểm này: Điều gì đủ điều kiện là "tồn tại"? Nó khác với "yêu cầu HTTP GET cho URL đó thành công như thế nào"? – bignose

Trả lời

29
>>> import httplib 
>>> 
>>> def exists(site, path): 
...  conn = httplib.HTTPConnection(site) 
...  conn.request('HEAD', path) 
...  response = conn.getresponse() 
...  conn.close() 
...  return response.status == 200 
... 
>>> exists('http://www.fakedomain.com', '/fakeImage.jpg') 
False 

Nếu tình trạng này là bất cứ điều gì khác hơn là một 200, tài nguyên không tồn tại tại địa chỉ URL. Điều này không có nghĩa là nó đã biến mất hoàn toàn. Nếu máy chủ trả về 301 hoặc 302, điều này có nghĩa là tài nguyên vẫn tồn tại, nhưng tại một URL khác. Để thay đổi chức năng xử lý trường hợp này, chỉ cần thay đổi dòng kiểm tra trạng thái thành return response.status in (200, 301, 302).

+2

+1, mặc dù tôi tưởng tượng bằng cách sử dụng 'HEAD' thay vì' GET' trong lệnh gọi 'conn.request' sẽ hiệu quả hơn vì bạn chỉ kiểm tra xem nó có tồn tại hay không. –

+0

@Daniel, cảm ơn vì mẹo đó. Tôi đã cập nhật mã để sử dụng HEAD. – tikiboy

+0

Nếu bạn gặp lỗi tương tự như: ** "gaierror: [Errno 8] nodename và servname được cung cấp, hoặc không biết" ** hãy chắc chắn rằng giá trị 'site' của bạn không bao gồm 'http: //', 'ftp: // ', vv Thay vào đó có vẻ như httplib sẽ cố gắng lấy được giao thức chính xác hoặc yêu cầu số cổng thích hợp được chỉ định (xem chú thích bổ sung bên dưới). – bluebinary

0

Tôi nghĩ rằng bạn có thể thử gửi một yêu cầu http để url và đọc response.If không phải ngoại lệ bị bắt, nó có thể tồn tại.

+0

đó là những gì tôi đã thử nhưng tôi không thể tìm thấy bất kỳ mẫu mã cụ thể nào. Bạn sẽ có một? – user257543

+0

@ user257543 Có vẻ như bạn đã có một cái tốt :) – Young

3

Có vẻ như http://www.fakedomain.com/fakeImage.jpg được tự động chuyển hướng đến http://www.fakedomain.com/index.html mà không có bất kỳ lỗi nào.

Chuyển hướng cho 301 và 302 câu trả lời được tự động hoàn tất mà không trả lời lại cho người dùng.

Hãy xem HTTPRedirectHandler, bạn có thể cần phải phân lớp nó để xử lý điều đó.

Đây là một trong những mẫu từ Dive Into Python:

http://diveintopython3.ep.io/http-web-services.html#redirects

+3

Tôi nghĩ rằng fakedomain.com được sử dụng ví dụ như được đặt tên và thực sự bạn không cần phải truy cập vào nó cho mình. :-) – Young

+1

@SpawnCxy, Lúc đầu, tôi nghĩ như vậy , nhưng khi tôi đi đến url đó, fakeImage.jpg không tồn tại và được chuyển hướng đến index.html, vì vậy tôi giả sử nó không chỉ là một ví dụ. – YOU

0

Tôi không biết tại sao bạn làm điều này, nhưng trong mọi trường hợp: cần lưu ý rằng chỉ vì yêu cầu "hình ảnh" thành công, không có nghĩa là bạn nghĩ nó là gì chuyển hướng đến bất kỳ thứ gì hoặc trả về bất kỳ dữ liệu nào thuộc bất kỳ loại nào và có thể gây ra sự cố tùy thuộc vào những gì bạn làm với phản hồi).

Xin lỗi, tôi đã đi trên một chè chén say sưa đọc về khai thác trực tuyến và làm thế nào để bảo vệ chống lại họ ngày hôm nay: P

1

Hãy thử nó với mechanize:

import mechanize 
br = mechanize.Browser() 
br.set_handle_redirect(False) 
try: 
br.open_novisit('http://www.fakedomain.com/fakeImage.jpg') 
print 'OK' 
except: 
print 'KO' 
7

nhờ cho tất cả các câu trả lời tất cả mọi người, đã kết thúc bằng như sau:

try: 
    f = urllib2.urlopen(urllib2.Request(url)) 
    deadLinkFound = False 
except: 
    deadLinkFound = True 
+0

Ngắn n 'ngọt ngào. Tôi đã sử dụng bản thân mình như chuỗi URL của tôi (khoảng 5000 trong số đó) là URI đầy đủ - Tôi không muốn quá chi tiết. Tôi cũng có thể giả định rằng tôi sẽ nhận được một 404 và không phải là một chuyển hướng. Bạn không chắc chắn nó sẽ làm việc với một chuyển hướng. – Flowpoke

+1

Vâng, sẽ cung cấp cho True trên URL lỗi cũng và thậm chí cả trên 301,302,303 lỗi cũng. –

3

Có vấn đề với câu trả lời trước đó khi tệp nằm trong máy chủ FTP (ftp://url.com/file), đang rống hoạt động khi tập tin là trong ftp, http hoặc https:

import urllib2 

def file_exists(url): 
    request = urllib2.Request(url) 
    request.get_method = lambda : 'HEAD' 
    try: 
     response = urllib2.urlopen(request) 
     return True 
    except: 
     return False 
+0

Tôi không thể nhận được bất kỳ câu trả lời nào trước đây để trả về False khi tôi nhập URL tệp sai, nhưng câu trả lời này hoạt động rất tốt! – Darkhydro

22

Đoạn code dưới đây là tương đương với tikiboy's answer, nhưng sử dụng một trình độ cao và dễ dàng sử dụng requests thư viện.

import requests 

def exists(path): 
    r = requests.head(path) 
    return r.status_code == requests.codes.ok 

print exists('http://www.fakedomain.com/fakeImage.jpg') 

Các requests.codes.ok bằng 200, vì vậy bạn có thể thay thế các mã trạng thái chính xác nếu bạn muốn.

requests.head có thể ném exception nếu máy chủ không phản hồi, vì vậy bạn có thể muốn thêm cấu trúc thử ngoại trừ.

Ngoài ra nếu bạn muốn bao gồm mã 301302, hãy xem xét đang 303 quá, đặc biệt là nếu bạn dereference URIs mà biểu thị nguồn lực trong Linked Data. URI có thể đại diện cho một người, nhưng bạn không thể tải xuống một người, vì vậy máy chủ sẽ chuyển hướng bạn đến trang mô tả người này bằng cách sử dụng 303 redirect.

+0

Câu trả lời này có vẻ là cách đơn giản nhất và bình thường nhất để thực hiện việc này ngay bây giờ. Xem http://stackoverflow.com/questions/2018026/should-i-use-urllib-or-urllib2-or-requests –

+0

Hoạt động hoàn hảo trong Python 3.5 đối diện với các câu trả lời khác. – Eskapp

0

Điều này có thể đủ tốt để xem liệu url có tồn tại hay không.

import urllib 
if urllib.urlopen('http://www.fakedomain.com/fakeImage.jpg').code == 200: 
    print 'File exists' 
Các vấn đề liên quan