ctrlCV工程师001 2024-03-03 22:16 采纳率: 0%
浏览 9

在保存文件到本地地址为什么出现错误?


import requests  # 导入用于发送 HTTP 请求的 requests 库
from lxml import etree  # 导入用于解析 HTML 的 etree 模块
import os  # 导入用于处理文件路径的 os 模块

# 设置保存图片的目录
path = os.getcwd() + '/images04'  # 获取当前工作目录,并创建一个名为 'images04' 的文件夹
if not os.path.exists(path):  # 如果 'images04' 文件夹不存在,则创建它
    os.mkdir(path)

# Bing 图片搜索的 URL 和请求头
url = 'https://cn.bing.com/images/search?q=一人之下图片&form=IQFRML&first=1&cw=1177&ch=693'  # Bing 图片搜索的 URL
headers = {  # 请求头,模拟浏览器发送请求
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
}

# 发送 HTTP 请求,获取搜索结果页面的 HTML 内容
response = requests.get(url, headers=headers)  # 发送 GET 请求,获取页面内容
html = etree.HTML(response.text)  # 使用 etree 模块解析 HTML 内容

# 通过 XPath 获取图片链接列表
images = html.xpath('//div[@class="dgControl waterfall"]//ul//li//a')

# 遍历图片链接列表
for image in images:
    image_str = image.get('href')  # 获取图片链接
    image_url = 'https://cn.bing.com/' + image_str  # 拼接完整的图片 URL
    filename = image_str.split('/')[-1]  # 提取图片文件名
    image_response = requests.get(image_url, headers=headers)  # 发送 GET 请求,获取图片内容

    # 保存图片到本地文件
    with open(filename, 'wb') as f:  # 以二进制写入模式打开文件
        f.write(image_response.content)  # 将图片内容写入文件

出现下面的问题

img

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-03-03 22:27
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    问题分析:

    1. 在保存图片到本地文件时,使用的文件名可能存在问题,导致无法正确保存图片。
    2. 没有考虑到图片链接中可能包含特殊字符,需要进行处理以避免文件名不合法导致保存失败的问题。
      解决方案:
    3. 修改获取文件名的方式,确保文件名的合法性和唯一性。
    4. 考虑使用图片的 MD5 值作为文件名,以确保文件名的唯一性,并将特殊字符转换为有效的文件名字符。
      以下是修改后的代码:
      pythonCopy code
      import requests
      from lxml import etree
      import os
      import hashlib  # 导入用于生成 MD5 值的 hashlib 模块
      # 设置保存图片的目录
      path = os.getcwd() + '/images04'
      if not os.path.exists(path):
      os.mkdir(path)
      url = 'https://cn.bing.com/images/search?q=一人之下图片&form=IQFRML&first=1&cw=1177&ch=693'
      headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
      }
      response = requests.get(url, headers=headers)
      html = etree.HTML(response.text)
      images = html.xpath('//div[@class="dgControl waterfall"]//ul//li//a')
      for index, image in enumerate(images):  # 使用 enumerate 获取索引
      image_str = image.get('href')
      image_url = 'https://cn.bing.com/' + image_str
      image_response = requests.get(image_url, headers=headers)
      # 使用 MD5 值作为文件名
      filename = hashlib.md5(image_response.content).hexdigest() + '.jpg'
      # 将特殊字符转换为有效的文件名字符
      filename = ''.join(c if c.isalnum() else '_' for c in filename)
      # 保存图片到本地文件
      with open(os.path.join(path, filename), 'wb') as f:  # 使用 os.path.join() 拼接文件路径
      f.write(image_response.content)
      
      这样就可以避免文件名不合法导致保存失败的问题,并确保文件名的唯一性。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    评论

报告相同问题?

问题事件

  • 创建了问题 3月3日