2016-05-11 4 views
4

Изображение http://i.imgur.com/OigSBjF.pngКак скачать изображения с BeautifulSoup?

импорт просит из BS4 импорта BeautifulSoup

r = requests.get("xxxxxxxxx") 
soup = BeautifulSoup(r.content) 

for link in links: 
    if "http" in link.get('src'): 
     print link.get('src') 

Я получаю напечатанную URL, но не знаю, как работать с ним.

+4

BeautifulSoup предназначен для разбора HTML, 'запросы' предназначены для запросов по HTTP. Загрузка относится к последней категории. 'request.get', а затем проверьте документацию о том, как сохранить тело ответа. –

ответ

4

Вам необходимо скачать и записать на диск:

import requests 
from os.path import basename 

r = requests.get("xxx") 
soup = BeautifulSoup(r.content) 

for link in links: 
    if "http" in link.get('src'): 
     lnk = link.get('src') 
     with open(basename(lnk), "wb") as f: 
      f.write(requests.get(lnk).content) 

Вы также можете использовать выбрать фильтровать теги, чтобы получить только те, с HTTP ссылки:

for link in soup.select("img[src^=http]"): 
     lnk = link["src"] 
     with open(basename(lnk)," wb") as f: 
      f.write(requests.get(lnk).content) 
+0

Большое спасибо! –

+0

Не беспокойтесь, используя подход «Выбор», это лучший подход для всех, чтобы отфильтровать теги –

0

В то время как другие ответы совершенно правильны.

Я нашел его очень медленным для загрузки и не знаю прогресса с изображениями с высоким разрешением.

Итак, сделайте это.

from bs4 import BeautifulSoup 
import requests 
import subprocess 

url = "https://example.site/page/with/images" 
html = requests.get(url).text # get the html 
soup = BeautifulSoup(html, "lxml") # give the html to soup 

# get all the anchor links with the custom class 
# the element or the class name will change based on your case 
imgs = soup.findAll("a", {"class": "envira-gallery-link"}) 
for img in imgs: 
    imgUrl = img['href'] # get the href from the tag 
    cmd = [ 'wget', texUrl ] # just download it using wget. 
    subprocess.Popen(cmd) # run the command to download 
    # if you don't want to run it parallel; 
    # and wait for each image to download just add communicate 
    subprocess.Popen(cmd).communicate() 

Предупреждение: оно не будет работать на win/mac при использовании wget.

Бонус: вы можете видеть прогресс каждого изображения, если вы не используете связь.

Смежные вопросы