Скачать файл изображения из источника HTML-страницы с помощью Python?

Я пишу парсер, который загружает все файлы изображений с HTML-страницы и сохраняет их в определенной папке. все изображения являются частью HTML-страницы.

"Как я могу% s"% title

Federico A. Ramponi 03.11.2008 00:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
44
1
93 062
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы должны загрузить страницу и проанализировать html-документ, найти свое изображение с помощью регулярного выражения и загрузить его. Вы можете использовать urllib2 для загрузки и Beautiful Soup для анализа html-файла.

Используйте htmllib для извлечения всех тегов img (переопределите do_img), затем используйте urllib2 для загрузки всех изображений.

Это предполагает неразрывный html, с которым может справиться Beautiful Soup.

Ali Afshar 03.11.2008 00:51

С другой стороны, здесь используются только стандартные библиотечные модули.

tzot 03.11.2008 01:57
Ответ принят как подходящий

Вот код для загрузки всех изображений с предоставленного URL-адреса и сохранения их в указанной выходной папке. Вы можете изменить его под свои нужды.

"""
dumpimages.py
    Downloads all the images on the supplied URL, and saves them to the
    specified output file ("/test/" by default)

Usage:
    python dumpimages.py http://example.com/ [output]
"""
from bs4 import BeautifulSoup as bs
from urllib.request import (
    urlopen, urlparse, urlunparse, urlretrieve)
import os
import sys

def main(url, out_folder = "/test/"):
    """Downloads all the images at 'url' to /test/"""
    soup = bs(urlopen(url))
    parsed = list(urlparse(url))

    for image in soup.findAll("img"):
        print("Image: %(src)s" % image)
        filename = image["src"].split("/")[-1]
        parsed[2] = image["src"]
        outpath = os.path.join(out_folder, filename)
        if image["src"].lower().startswith("http"):
            urlretrieve(image["src"], outpath)
        else:
            urlretrieve(urlunparse(parsed), outpath)

def _usage():
    print("usage: python dumpimages.py http://example.com [outpath]")

if __name__ == "__main__":
    url = sys.argv[-1]
    out_folder = "/test/"
    if not url.lower().startswith("http"):
        out_folder = sys.argv[-1]
        url = sys.argv[-2]
        if not url.lower().startswith("http"):
            _usage()
            sys.exit(-1)
    main(url, out_folder)

Редактировать: Теперь вы можете указать папку вывода.

open(..).write(urlopen(..) можно заменить на urllib.urlretrieve()
jfs 03.11.2008 15:48

Ваш код не работает, если расположение изображений указано относительно документа HTML. Не могли бы вы включить исправление предоставлено unutbu на случай, если кто-то будет использовать ваш скрипт в будущем?

Niklas B. 29.12.2011 00:51

@NiklasB. Я столкнулся с той же проблемой. В итоге я просто использовал регулярное выражение для поиска ссылок на все изображения, что, на мой взгляд, более надежно, чем Beautifulsoup.

foresightyj 02.03.2013 12:12

А это функция для загрузки одного изображения:

def download_photo(self, img_url, filename):
    file_path = "%s%s" % (DOWNLOADED_IMAGE_PATH, filename)
    downloaded_image = file(file_path, "wb")

    image_on_web = urllib.urlopen(img_url)
    while True:
        buf = image_on_web.read(65536)
        if len(buf) == 0:
            break
        downloaded_image.write(buf)
    downloaded_image.close()
    image_on_web.close()

    return file_path

у меня отлично работает при удалении цикла while (не его содержимого!)

Ron 15.08.2012 17:10

Решение Райана хорошее, но не работает, если URL-адреса источника изображения являются абсолютными URL-адресами или чем-либо, что не дает хорошего результата при простом соединении с URL-адресом главной страницы. urljoin распознает абсолютные и относительные URL-адреса, поэтому замените цикл посередине на:

for image in soup.findAll("img"):
    print "Image: %(src)s" % image
    image_url = urlparse.urljoin(url, image['src'])
    filename = image["src"].split("/")[-1]
    outpath = os.path.join(out_folder, filename)
    urlretrieve(image_url, outpath)

Если запрос требует авторизации, обратитесь к этому:

r_img = requests.get(img_url, auth=(username, password)) 
f = open('000000.jpg','wb') 
f.write(r_img.content) 
f.close()

Другие вопросы по теме