使用Beautiful Soup提取无扩展名图片的data-src及补全链接的方法
问题解答
1. 提取img标签的data-src属性值
你已经定位到了class为img-container的div节点,只需在该节点下继续查找img子节点,直接访问对应属性即可,示例代码片段如下:
# 从当前图书条目下定位img容器,不要用全局soup查找避免重复匹配 img_container = item.find('div', class_='img-container') # 查找容器内的img标签 img_tag = img_container.find('img', class_='lazy') # 提取data-src属性,get方法在属性不存在时不会抛出异常 data_src = img_tag.get('data-src')
注意:你原有代码中循环内用
soup.find_all查找全局的img容器,会重复匹配所有图书的封面,建议改为从当前遍历的item下查找,仅匹配当前图书的封面节点。
2. 拼接生成完整可访问图片链接
你目标站点的/en/helper/ReadImage/接口默认返回JPG格式资源,直接拼接站点前缀和.jpg后缀即可正常访问。如果需要适配不确定扩展名的通用场景,可以请求一次资源从响应头中提取格式,当前场景直接拼接即可:
# 用rstrip去掉baseurl末尾多余的斜杠,避免拼接出现双斜杠 full_img_url = baseurl.rstrip('/') + data_src + '.jpg'
修正后的完整可运行代码
from bs4 import BeautifulSoup import requests baseurl = "https://www.nb.co.za/" productlinks = [] cover_links = [] r = requests.get('https://www.nb.co.za/en/books/0-6-years') soup = BeautifulSoup(r.content, 'lxml') productlist = soup.find_all('div', class_="book-slider-frame") def my_filter(tag): return (tag.name == 'a' and tag.parent.name == 'div' and 'img-container' in tag.parent['class']) for item in productlist: # 提取商品详情页链接 for link in item.find_all(my_filter, href=True): productlinks.append(baseurl + link['href']) # 提取封面图完整链接 img_tag = item.find('div', class_="img-container").find('img', class_='lazy') data_src = img_tag.get('data-src') full_cover = baseurl.rstrip('/') + data_src + '.jpg' cover_links.append(full_cover) print(full_cover)
内容的提问来源于stack exchange,提问作者Schalk Joubert
相关产品推荐
相关产品推荐

