файлы сохраняются повторно с одним именем, без цикла, без ранжирования

#python-3.x #beautifulsoup #python-requests #python-os

#python-3.x #beautifulsoup #python-запросы #python-os

Вопрос:

Мои коды работают хорошо, но имеют один недостаток. Они не сохраняются соответствующим образом. Например, допустим, я обнаружил 3 файла jpeg, когда я запустил коды, они сохраняются 3 раза в слоте 1, 3 раза в слоте 2 и 3 раза в слоте 3. Итак, у меня получилось 3 одинаковых файла.

Я думаю, что что-то не так с моей логикой цикла? Если я изменил for n in range(len(soup_imgs)): на for n in range(len(src)): , операция сохраняет бесконечно последние файлы JPEG.

 soup_imgs = soup.find(name='div', attrs={'class':'t_msgfont'}).find_all('img', alt="", src=re.compile(".jpg"))
for i in soup_imgs:
    src = i['src']
    print(src)

dirPath = "C:\__SPublication__\" 
img_folder = dirPath   '/'   soup_title   '/'
if (os.path.exists(img_folder)):
    pass
else:
    os.mkdir(img_folder)

for n in range(len(src)):
    n  = 1
    img_name = dirPath   '/'   soup_title   '/'   str({}).format(n)   '.jpg'
    img_files = open(img_name, 'wb')
    img_files.write(requests.get(src).content)
    print("Outputs:"   img_name)
  

Я любитель в кодировании, только недавно начал заниматься своим хобби. Пожалуйста, дайте мне несколько советов, начальники.

Комментарии:

1. Откуда берется soup_title переменная? Я добавил ответ, но эта переменная выделяется как неопределенная с учетом предоставленного вами кода.

2. извините за это, это не полное кодирование, я просто вставил, где проблемы.

Ответ №1:

Попробуйте это при записи файлов изображений:

 from os import path

for i, img in enumerate(soup_imgs):
    src = img['src']
    img_name = path.join(dirPath, soup_title, "{}.jpg".format(i))
    with open(img_name, 'wb') as f:
        f.write(requests.get(src).content)
    print("Outputs:{}".format(img_name))
  

Вам нужно перебирать все источники изображений, а не использовать последнее src значение из предыдущего for блока.

Я также добавил более безопасный метод объединения путей к каталогам и файлам, который должен быть независимым от ОС. Наконец, при открытии файла всегда используйте with open() as f: конструкцию — таким образом, Python автоматически закроет дескриптор файла для вас.

Комментарии:

1. Большое вам спасибо, функция «enumerate» отлично разделила все фрагментированные ссылки img. Мне еще так многому нужно научиться. Спасибо за советы.

2. я нашел кое-что интересное, почему порядок сохранения снизу вверх? последний первый — это логика python?

3. Нет, этого вообще не должно быть. Первый файл в soup_imgs будет сохранен первым.