You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Web Scraping嵌套标签技术问题:获取Books to Scrape网站书籍星级评分时返回完整标签而非评分值的原因排查

问题:从Books to Scrape抓取书籍星级评分的代码问题

我尝试从Books to Scrape网站获取每本书的星级评分,写了这段Python代码:

import requests
from bs4 import BeautifulSoup
from urllib.request import urlopen
import re

response = requests.get('http://books.toscrape.com/')
if response.status_code == 200:
    print('Requisição bem sucedida!')
linhas = soup.find_all(class_=re.compile("rating"))

但运行后得到的是包含嵌套<i>标签的<p>标签内容,比如:

<p class="star-rating Three"> <i class="icon-star"></i> <i class="icon-star"></i> <i class="icon-star"></i> <i class="icon-star"></i> <i class="icon-star"></i> </p>

想请教这段代码存在什么问题?


你的代码主要有两个问题,咱们一步步来捋清楚:

1. 遗漏了BeautifulSoup的初始化步骤

你成功发起了请求,但完全没把响应内容交给BeautifulSoup去解析——soup变量根本没定义就直接调用了,正常运行这里应该会弹出NameError错误才对。得在请求成功后加上解析的代码:

response = requests.get('http://books.toscrape.com/')
if response.status_code == 200:
    print('Requisição bem sucedida!')
    # 新增:用BeautifulSoup解析网页内容
    soup = BeautifulSoup(response.text, 'html.parser')
linhas = soup.find_all(class_=re.compile("rating"))

2. 没有提取出真正的星级信息

就算你修复了第一个问题,find_all返回的是整个<p>标签对象,而你要的星级其实藏在<p>的class属性里——比如Three对应3星、Five对应5星。你需要把这个信息提取出来,甚至可以转换成数字方便使用:

给你一个修改后的完整示例:

import requests
from bs4 import BeautifulSoup
import re

response = requests.get('http://books.toscrape.com/')
if response.status_code == 200:
    print('Requisição bem sucedida!')
    soup = BeautifulSoup(response.text, 'html.parser')
    # 找到所有带rating标识的p标签
    rating_tags = soup.find_all(class_=re.compile("rating"))
    
    # 先定义一个英文星级到数字的映射
    star_mapping = {
        'One': 1,
        'Two': 2,
        'Three': 3,
        'Four': 4,
        'Five': 5
    }
    
    # 逐个提取星级
    for tag in rating_tags:
        # 从class列表里挑出不是star-rating的那个值(就是星级的英文)
        star_label = [cls for cls in tag['class'] if cls != 'star-rating'][0]
        # 转换成数字星级,找不到就返回"未知"
        star_rating = star_mapping.get(star_label, '未知')
        print(f"书籍星级:{star_rating}")

这样运行后,你就能直接拿到每本书的数字星级评分,而不是一堆HTML标签啦。


内容的提问来源于stack exchange,提问作者Ricardo Cauduro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:37:31