logo
Loading...

UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x119c58ef0> - Cupoy

教練們好:主要想請問的是: 在以下這兩行code都有回應的情況下,為何還會讀不到圖片?respons...

ml100,ml100-d05

UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x119c58ef0>

2020/05/16 下午 01:44
機器學習共學討論版
James Chang
觀看數:224
回答數:4
收藏數:0
ml100
ml100-d05

教練們好:


主要想請問的是: 在以下這兩行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:23
    James 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 😃😃😃