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
相关产品推荐
相关产品推荐

