从多个网址提取图像

时间:2019-12-08 09:49:25

标签: python pandas beautifulsoup

我想遍历网址列表并从每个页面提取图像。但是,在某些情况下,图片不存在,并且网址与我通常观察到的网址格式不同。

例如,当我遇到这样的网址时,例如使用我拥有的代码-  我收到错误消息

这是我编写的代码:

file = pd.read_csv(path)
for index,row in file.iterrows():
    site = row['link']
    response = requests.get(site)
    soup = BeautifulSoup(response.text, 'html.parser')
    pics = soup.find('img')
    pic_url = pics['src']
    urllib.request.urlretrieve(pic_url,'C:\\Users\\User\\test\\pictures\\'+ str(site.split('/')[-1])+'.jpg')

这是我的数据样本

name            link
 one            https://boxrec.com/en/proboxer/844760
 two            https://boxrec.com/en/proboxer/838706
 three          https://boxrec.com/en/proboxer/879108
 four           https://boxrec.com/en/proboxer/745266

这是我的错误消息

  

ValueError:未知的URL类型:'/build/images/main/avatar.jpeg'

更新: 我尝试添加尝试,除了捕获错误并继续。但是我随后开始收到错误消息

  

TypeError:“ NoneType”对象不可下标

然后我将代码更新为此

try:
         pic_url = pics['src']
except:
         image = 'https://chapters.theiia.org/central-mississippi/About/ChapterOfficers/_w/person-placeholder_jpg.jpg'
         urllib.request.urlretrieve(image,'C:\\Users\\User\\test\\pictures\\'+str(site.split('/')[-1])+'.jpg')
try:
        urllib.request.urlretrieve(pic_url,'C:\\Users\\User\\test\\pictures\\'+ str(site.split('/')[-1])+'.jpg')
except:
        image = 'https://chapters.theiia.org/central-mississippi/About/ChapterOfficers/_w/person-placeholder_jpg.jpg'
        urllib.request.urlretrieve(image,'C:\\Users\\User\\test\\pictures\\'+str(site.split('/')[-1])+'.jpg')

但是这会返回多次重复,在某些情况下,id实际存在的图片将返回空白图片

3 个答案:

答案 0 :(得分:0)

如果您只是想避免该错误并继续使用其他有效的图像,则可以将其包含在try: except: continue

类似这样的东西

try:
    urllib.request.urlretrieve(...)
except ValueError:
    continue

答案 1 :(得分:0)

只需简单地将其放入带有for循环的try / except块中,以便在遇到每个异常时都可以继续到列表中的下一个事物

file = pd.read_csv(path)
for index,row in file.iterrows():
    site = row['link']
    try:
       response = requests.get(site)
       soup = BeautifulSoup(response.text, 'html.parser')
       pics = soup.find('img')
       pic_url = pics['src']
       urllib.request.urlretrieve(pic_url,'C:\\Users\\User\\test\\pictures\\'+ str(site.split('/')[-1])+'.jpg')
    except Exception:
            continue

答案 2 :(得分:0)

因为'/build/images/main/avatar.jpeg'是相对路径,它是可以被过滤掉的默认化身,如果不想过滤掉,可以将其转换为完整路径。以下代码包括自动转换功能。 以下代码使用简化的库

from simplified_scrapy.simplified_doc import SimplifiedDoc 
file = pd.read_csv(path)
for index,row in file.iterrows():
    site = row['link']
    response = requests.get(site)
    doc = SimplifiedDoc(response.text)
    pics = doc.listImg(url=site)[0]
    pic_url = pics.url
    urllib.request.urlretrieve(pic_url,'C:\\Users\\User\\test\\pictures\\'+ str(site.split('/')[-1])+'.jpg')