UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x119c58ef0>
教練們好:
主要想請問的是: 在以下這兩行code都有回應的情況下,為何還會讀不到圖片?
response = requests.get('link_name')
1. print(response.status_code)
2. if response.status_code == requests.codes.ok:
print('ok')
--------------------------------------------
在第五課的作業的地方,整理好dataframe後,我用for loop測試前幾個連結 (這邊我設定測試前8個),若是link 確實有抓到連結,則將該連結加進一個新的list。並在集滿五個有效連結後,跳出loop。
上面的code執行的結果,的確獲得五個連結。而在下面的code,我驗證第五個連結是否有效:
status_code 正常返回200的值,而且 response.status_code == requests.codes.ok 也是ok的情況下,為何會產生此錯誤訊息且讀不到圖片呢?
感謝您的回覆。
回答列表
-
2020/05/16 下午 10:54謝政哲贊同數:1不贊同數:0留言數:0
http://fotootjesvanannelies.web-log.nl/olifantfotootjes/images/2008/06/04/img_8870.jpg
應該是這張圖片網址的原因。我也剛好遇到同樣的問題,只知道點開來看不是一張單純的圖片,是一個可以讓response.status_code ==requests.codes.ok 為True的網址。
-
2020/05/17 上午 01:51張維元 (WeiYuan)贊同數:1不贊同數:0留言數:0
順著政哲的回答,這個網址的確不是一個正常的圖片,其實只是網址是 .jpg 的網頁而已。 這裡可以用 resp 的 Header 來檢查:
```
def is_url_image(image_url):
image_formats = ("image/png", "image/jpeg", "image/jpg")
r = requests.head(image_url)
if r.headers["content-type"] in image_formats:
return True
return False```
如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃
-
2020/05/17 上午 09:23James Chang贊同數:0不贊同數:0留言數:0
2020/05/17 追加提問
教練您好:
感謝答覆。 剛才試了一下結果如下:
測試後,結果包含有圖片的前四個連結+沒有圖片的第五個連結,headers['Content-Type‘] 都顯示text/html的樣子。抱歉,我不太熟悉html相關的知識,不知道哪裡出錯了?上面的code查找不到image/png or image/jpg.
目前我是測試直接打開看看圖片,如果img = Image.open(BytesIO(response.content)) 有打得開,才加入img_list。這樣的結果在前十個連結裡,成功打開了五張圖片,最後一張圖片是兩隻老虎的。 只是不知道還有沒有其他更好的方法。
-
2020/05/23 上午 01:47張維元 (WeiYuan)贊同數:1不贊同數:0留言數:0
嗨嗨,因為 HTTP Header 不是那麼嚴格的限定,很多時候不是一個好的驗證方式。最暴力的方式還是像你「目前我是測試直接打開看看圖片,如果img = Image.open(BytesIO(response.content)) 有打得開,才加入img_list。這樣的結果在前十個連結裡,成功打開了五張圖片,最後一張圖片是兩隻老虎的。 只是不知道還有沒有其他更好的方法。」這樣做...
如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃