如何使用BeautifulSoup提取外层span嵌套的内层span标签文本
代码问题定位与修正方案
你当前提取评分失败的核心问题共3处,并非单纯的嵌套层级定位问题:
1. 商品容器查找语法失效
你编写的容器筛选代码:bed_data = soup.find_all("li", attrs={"class", "item product product-item"})
这里attrs参数内使用逗号分隔元素,属于Python集合的语法,并非字典的键值对格式,会导致BeautifulSoup无法解析筛选规则,要么触发类型报错,要么返回空列表,后续循环自然无法提取到正确的子标签内容。
正确的字典格式需要用冒号分隔属性名与属性值:
bed_data = soup.find_all("li", attrs={"class": "item product product-item"})
2. 评分标签定位后的文本提取层级错误
就算修正了容器筛选的语法,你当前的逻辑是直接对带rating-value类的外层span调用getText(),这种方式会把外层span内的所有文本节点全部抓取下来,包括标签前后的换行、空白占位、甚至其他隐藏节点的文本,无法精准获取内层嵌套span里的评分值。
正确的提取逻辑是:定位到外层rating-value的span后,再向下查找它内部嵌套的子级span标签,专门提取这个内层标签的纯文本,即可精准拿到类似"89%"的评分值。
3. 空值触发的运行时报错
你当前的代码没有对查找结果做非空判断,站点上部分无用户评分的商品不会渲染对应的评分span标签,直接对None类型的返回值调用getText(),会触发AttributeError导致整个爬虫中断。
修正后的完整核心逻辑
import requests from bs4 import BeautifulSoup import pandas as pd scraped_data = [] page = requests.get('https://www.swisssense.nl/bedden') soup = BeautifulSoup(page.content, 'html.parser') # 修正商品容器的查找语法 bed_data = soup.find_all("li", attrs={"class": "item product product-item"}) for bed in bed_data: # 商品名提取,加非空判断 name_tag = bed.find("a", class_="product-item-link") bed_naam = name_tag.get_text(strip=True) if name_tag else "" # 价格提取 price_tag = bed.find("span", class_="price") bed_price = price_tag.get_text(strip=True) if price_tag else "" # 评分提取,逐层定位 bed_rating = "" # 第一步:找外层带rating-value类的span rating_wrapper = bed.find("span", class_="rating-value") if rating_wrapper: # 第二步:找外层span内部嵌套的子级span inner_rating_tag = rating_wrapper.find("span") if inner_rating_tag: bed_rating = inner_rating_tag.get_text(strip=True) scraped_data.append( {"bed_naam": bed_naam, "bed_price": bed_price, "bed_rating": bed_rating} ) dataFrame = pd.DataFrame.from_dict(scraped_data) dataFrame.to_csv('swisssense.csv', index=False)
补充优化提示
- 调用
get_text()时直接传入strip=True参数,会自动清除文本前后的所有空白、换行符,不需要后续手动调用.strip()处理 - 你原代码中写的商品图片提取逻辑
bed_images= bed.find("img", class_="product-image-photo").getText()存在错误:img是自闭合空标签,自身没有文本内容,如果需要导出图片链接,应该通过属性取值的方式获取src字段值:bed.find("img", class_="product-image-photo").get("src"),再将其加入导出的字段字典即可 - 循环遍历每个商品容器再查找内部子标签的逻辑是合理的,比全局一次性查找所有商品名、价格、评分再做索引对齐的方案更稳定,不会出现列表长度不匹配导致的字段错位问题
内容的提问来源于stack exchange,提问作者Thomas Franken
相关产品推荐
相关产品推荐

