[文件以单个名称重复保存,没有循环,没有范围

问题描述 投票:1回答:1

我的代码运行良好,但有一个缺陷。他们没有相应地保存。例如,假设我捕获了3个jpeg文件,当我运行代码时,它在插槽1中保存了3次,在插槽2中保存了3次,在插槽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)

我是编码方面的业余爱好者,不久前刚开始是我的爱好。酋长,请给我一些指导。

python-3.x beautifulsoup python-requests python-os
1个回答
2
投票

[编写图像文件时请尝试以下操作:

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将自动为您关闭文件句柄。

© www.soinside.com 2019 - 2024. All rights reserved.