使用BeautifulSoup网页抓取时如何获取无id属性的价格字段值
无id属性的BeautifulSoup元素定位方案
目标元素未设置id时,完全可以通过其他属性、节点关系、文本特征等方式定位抓取,以下是适配你场景的常用方案:
- 组合class/自定义属性定位
直接用find方法的attrs参数传入任意属性组合即可匹配目标元素,亚马逊的价格元素通常带有a-price-whole、a-offscreen等固定class,示例写法:
# 单个class定位 price = soup2.find('span', class_='a-offscreen').get_text(strip=True) # 多属性组合定位,准确率更高 price = soup2.find('span', attrs={'class':'a-offscreen', 'data-a-color':'price'}).get_text(strip=True)
- 通过节点层级关系定位
先定位到有唯一标识的父级容器,再向下查找目标子元素,可避免全局匹配到无关的同属性元素:
# 先找到价格模块的父容器(亚马逊该容器id长期稳定) price_container = soup2.find(id='corePrice_feature_div') # 再从容器内找价格元素 price = price_container.find('span', class_='a-offscreen').get_text(strip=True)
- 文本特征关联定位
如果目标元素紧邻固定文本标签,可先匹配文本再找相邻节点:
# 先匹配“售价”相关的固定文本 price_label = soup2.find(string=lambda t: t and '£' in t.strip() or '售价' in t.strip()) # 再提取对应数值 price = price_label.get_text(strip=True)
适配你场景的可运行完整代码
from bs4 import BeautifulSoup import requests import time import datetime URL = "https://www.amazon.co.uk/Got-Data-MIS-Business-Analyst/dp/B09F319PK2/ref=sr_1_1?keywords=funny+got+data+mis+data+systems+business+analyst+tshirt&qid=1636481904&qsid=257-9827493-6142040&sr=8-1&sres=B09F319PK2%2CB09F33452D%2CB08MCBFLHC%2CB07Y8Z4SF8%2CB07GJGXY7P%2CB07Z2DV1C2%2CB085MZDMZ8%2CB08XYL6GRM%2CB095CXJ226%2CB08JDMYMPV%2CB08525RB37%2CB07ZDNR6MP%2CB07WL5JGPH%2CB08Y67YF63%2CB07GD73XD8%2CB09JN7Z3G2%2CB078W9GXJY%2CB09HVDRJZ1%2CB07JD7R6CB%2CB08JDKYR6Q&srpt=SHIRT" headers = {"User-Agent": "Mozilla/5.0 (X11; CrOS x86_64 14092.77.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.107 Safari/537.36"} page = requests.get(URL, headers = headers) soup1 = BeautifulSoup(page.content, "html.parser") soup2 = BeautifulSoup(soup1.prettify(), "html.parser") title = soup2.find(id="productTitle").get_text(strip=True) # 替换原有的id定位方式,改为父容器+子class定位 price_container = soup2.find(id='corePrice_feature_div') price = price_container.find('span', class_='a-offscreen').get_text(strip=True) print(title) print(price)
注意事项
- 亚马逊页面结构会不定期更新,定位前可先打印
soup2或者通过浏览器F12开发者工具确认目标元素的最新属性 - 多属性、层级组合定位的准确率远高于单一属性定位,优先使用该类方式
- 提取文本后使用
strip()方法可直接去掉前后多余的换行、空格,无需额外做清洗处理
内容的提问来源于stack exchange,提问作者Dami Famakin
相关产品推荐
相关产品推荐

