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
相关产品推荐
相关产品推荐

