You need to enable JavaScript to run this app. Python Selenium获取img src返回None,alt为空的问题解决方案问询
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium获取img src返回None,alt为空的问题解决方案问询

问题解决方法

首先明确:空alt属性属于合法HTML结构,不会导致Selenium无法读取src属性,你遇到的返回None的情况90%以上是电商站点常用的图片懒加载机制导致:未进入可视区域的图片不会主动加载src属性,真实图片地址会存在data-src/data-original这类自定义属性中,等页面滚动到对应位置才会替换到src属性上。

可行绕过方案

  • 方案1:多属性兜底读取,避免依赖单一src属性
    修改获取图片地址的逻辑,依次读取所有可能存储图片地址的属性,只要拿到有效值就返回。
  • 方案2:模拟页面滚动触发懒加载
    每次加载页面后先执行JS滚动到页面底部,等待所有懒加载资源加载完成后再提取数据
  • 方案3:直接解析元素HTML提取地址
    若Selenium的get_attribute确实存在解析异常,可以直接获取img元素的完整HTML代码,手动正则提取src值,完全绕开属性解析逻辑。

修改后的代码示例

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import re

webdriver.DesiredCapabilities.CHROME['acceptSslCerts']=True

driver = webdriver.Chrome()

# 提取图片地址的通用方法
def get_img_src(img_element):
    # 优先读取常用的图片地址属性,按优先级排序
    attr_list = ['src', 'data-src', 'data-original', 'data-url']
    for attr in attr_list:
        src = img_element.get_attribute(attr)
        if src and src.startswith('http'):
            return src
    # 兜底:直接解析元素HTML提取src
    outer_html = img_element.get_attribute('outerHTML')
    src_match = re.search(r'src="([^"]+)"', outer_html)
    if src_match:
        return src_match.group(1)
    return None

categories = [
    "sleeping+bags",
    "sleeping+pads",
    "carabiners"
]

for category in categories:
  driver.get(f'https://www.backcountry.com/Store/catalog/search.jsp?s=u&q={category}')
  # 加载页面后先滚动到底部触发懒加载
  driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  time.sleep(2) # 等待资源加载

  def get_products():
      products = driver.find_elements_by_class_name('product')
      for product in products:
          brand = product.find_element_by_class_name('ui-pl-name-brand').text
          model = product.find_element_by_class_name('ui-pl-name-title').text
          img_element = product.find_element_by_class_name('ui-pl-img').find_element_by_tag_name('img')
          image = get_img_src(img_element)

          print({ "category": category, "page": page, "brand": brand, "model": model, "image": image})

  # 执行逻辑
  page = 1
  get_products()

  loop = True
  while loop:
      try:
          next_page = driver.find_element_by_link_text('Next Page')
          next_page.click()
          time.sleep(3)
          # 翻页后同样先滚动触发懒加载
          driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
          time.sleep(2)
          page += 1
          get_products()
      except:
          loop = False

额外优化建议

  • 可以把固定等待的time.sleep换成Selenium的显式等待,提高爬取效率
  • 如果站点有反爬机制,可以添加随机UA、请求间隔抖动等逻辑降低被封风险

内容的提问来源于stack exchange,提问作者Leif Flor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 16:36:05