Python解析html中图片并下载到本地

📅 发布时间:2026/7/15 20:45:10 👁️ 浏览次数:
Python解析html中图片并下载到本地
importosimportreimportrequestsfrombs4importBeautifulSoupfromurllib.parseimporturljoin,urlparsedefdownload_images_from_html(html_content,save_dir,target_size800x800,source_size228x228): 解析 HTML 中的 img src替换尺寸后下载图片。 :param html_content: HTML 字符串 :param save_dir: 图片保存的本地文件夹路径 :param target_size: 目标尺寸字符串 (例如 800x800) :param source_size: 原尺寸字符串 (例如 228x228) # 1. 创建保存目录ifnotos.path.exists(save_dir):os.makedirs(save_dir)print(f已创建目录:{save_dir})# 2. 解析 HTMLsoupBeautifulSoup(html_content,html.parser)img_tagssoup.find_all(img)ifnotimg_tags:print(未找到任何 img 标签。)returnprint(f找到{len(img_tags)}张图片开始处理...)success_count0fail_count0fori,imginenumerate(img_tags):srcimg.get(src)ifnotsrc:continue# 3. 替换尺寸逻辑# 方案 A: 简单字符串替换 (针对你明确知道的 228x228)new_srcsrc.replace(source_size,target_size)# 方案 B (可选): 如果尺寸不固定想用正则替换任意 数字x数字# pattern r\dx\d# if re.search(pattern, src):# new_src re.sub(pattern, target_size, src)# else:# new_src src # 如果没有匹配到尺寸保持原样或跳过# 4. 处理相对路径 (如果 src 是 /images/xxx.jpg需要拼接域名)# 注意这里假设你是在某个具体网页上下文中如果是纯片段可能需要手动传入 base_url# 如果 src 已经是 http 开头urljoin 不会改变它# 如果你知道基础域名建议传入 base_url 参数这里演示自动尝试获取或忽略# 为了代码健壮性如果 src 不是 http 开头你可能需要手动指定 base_urlbase_domainhttps:# --- 请替换为真实的网站域名ifnotnew_src.startswith((http://,https://)):# 使用 urljoin 智能拼接自动处理斜杠问题# 例如: urljoin(https://a.com, /b.jpg) - https://a.com/b.jpg# urljoin(https://a.com/x/, b.jpg) - https://a.com/x/b.jpgfinal_urlurljoin(base_domain,new_src)print(f[修复] 相对路径已补全:{src}-{final_url})else:final_urlnew_src# 5. 生成文件名# 获取 URL 的最后部分作为文件名防止非法字符parsed_urlurlparse(final_url)original_filenameos.path.basename(parsed_url.path)# 清理文件名中的非法字符 (可选防止 Windows 报错)# 比如去除 ? # 等后续参数带来的干扰虽然 basename 通常能处理 path 部分if?inoriginal_filename:original_filenameoriginal_filename.split(?)[0]ifnotoriginal_filenameorlen(original_filename)3:original_filenamefdefault_{i}.jpg# 【关键修改】使用补零的序号并加上下划线分隔# i:03d 表示 0-000, 9-009, 10-010safe_indexf{i:03d}filenamef{safe_index}_{original_filename}save_pathos.path.join(save_dir,filename)# 防止文件名冲突如果文件已存在添加序号base_name,extos.path.splitext(filename)counter1whileos.path.exists(save_path):save_pathos.path.join(save_dir,f{base_name}_{counter}{ext})counter1# 6. 下载图片try:headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36}responserequests.get(final_url,headersheaders,timeout10)ifresponse.status_code200:withopen(save_path,wb)asf:f.write(response.content)print(f[成功]{final_url}-{save_path})success_count1else:print(f[失败] 状态码{response.status_code}:{final_url})fail_count1exceptExceptionase:print(f[错误] 下载失败{final_url}:{str(e)})fail_count1print(f\n--- 完成 ---\n成功:{success_count}, 失败:{fail_count})# 使用示例 if__name____main__:# 模拟一段 HTML 内容 (实际使用时你可以从文件读取或 requests 获取网页源码)html_sample div classimage-carousel-track vertical styletransform: translateY(0px); transition: transform 0.3s ease-in-out;div classitem img classimage srchttps://img10.360buyimg.com/pcpubliccms/s228x228_jfs/t1/394747/39/8804/109817/698c3fa7Fda89221c/00832ee3e8c5794f.jpg.avifimg classthumbnails-play-icon srchttps://img12.360buyimg.com/imagetools/jfs/t1/268427/6/7334/5868/677778bfFdfcd1873/09c35cebfaf51498.png/divdiv classitem img classimage srchttps://img10.360buyimg.com/pcpubliccms/s228x228_jfs/t1/394747/39/8804/109817/698c3fa7Fda89221c/00832ee3e8c5794f.jpg.avif/divdiv classitem currentimg classimage srchttps://img10.360buyimg.com/pcpubliccms/s228x228_jfs/t1/27093/21/22641/87924/66c6ad87Feccd4781/1d605d9572e7ee29.jpg.avif/divdiv classitem img classimage srchttps://img10.360buyimg.com/pcpubliccms/s228x228_jfs/t1/85036/13/47257/98441/66c6ad8aF8b8df9ab/8361e5b66ad4bf37.jpg.avif/divdiv classitem img classimage srchttps://img10.360buyimg.com/pcpubliccms/s228x228_jfs/t1/75578/15/28042/65311/66c6ad8bF3a9dabdf/ef8015681cbba30b.jpg.avif/divdiv classitem img classimage srchttps://img10.360buyimg.com/pcpubliccms/s228x228_jfs/t1/159827/2/44824/64504/66c6ad8cF2e38be73/9a53d4703d923589.jpg.avif/divdiv classitem div classparameterdiv classicon/divspan classtext规格参数/span/div/div/div # 配置保存路径save_directoryC:\\Users\\3主图# 执行函数# 注意如果 html_sample 中的 src 是相对路径你需要修改代码传入 base_urldownload_images_from_html(html_contenthtml_sample,save_dirsave_directory,source_size228x228,target_size800x800)