使用BeautifulSoup提取图片URL遇异常:存在src属性却返回None
解决BeautifulSoup提取img标签src属性返回None的问题
可能的原因
- 属性名大小写不一致:HTML本身不区分标签和属性名的大小写,但BeautifulSoup的
get()方法是区分大小写的。如果HTML中img标签的属性写的是SRC、Src这类非全小写形式,用img.get('src')就会返回None。 - 解析器差异:不同的HTML解析器(比如
html.parser、lxml、html5lib)对属性名的处理可能不同,部分解析器会保留原始的大小写属性名,导致无法通过小写的'src'获取到值。 - 混淆渲染后与原始HTML:你在浏览器开发者工具中看到的img标签有src属性,可能是页面通过JavaScript动态加载的,但实际请求到的原始HTML中该标签并没有src属性——BeautifulSoup只能解析静态HTML内容。
解决方法
1. 兼容属性名大小写
遍历img标签的所有属性,匹配不区分大小写的src属性,同时过滤掉空值:
def _get_images(self, soup): article_images = [] images = soup.find_all("img") for img in images: src = None # 遍历所有属性,找到不区分大小写的src for attr_name, attr_value in img.attrs.items(): if attr_name.lower() == 'src': src = attr_value break if src: article_images.append(src) return article_images
或者用更简洁的方式,同时尝试不同大小写的属性名:
def _get_images(self, soup): article_images = [] images = soup.find_all("img") for img in images: src = img.get('src') or img.get('SRC') or img.get('Src') if src: article_images.append(src) return article_images
2. 切换HTML解析器
如果是解析器导致的属性名处理问题,可以尝试使用html5lib(需先安装:pip install html5lib),它会将所有属性名统一转为小写:
from bs4 import BeautifulSoup import requests # 使用html5lib解析页面 response = requests.get('目标页面URL') soup = BeautifulSoup(response.text, 'html5lib')
3. 验证原始HTML内容
确认你获取的原始HTML中确实包含目标img标签的src属性:
# 打印解析后的完整HTML结构,检查目标img标签 print(soup.prettify())
如果打印结果中对应img标签没有src属性,说明是页面动态加载导致的,此时需要使用Selenium等工具模拟浏览器渲染,获取完整的渲染后HTML。
内容的提问来源于stack exchange,提问作者user21822582
相关产品推荐
相关产品推荐

