如何使用BeautifulSoup提取div标签的rating-value属性值
如何用BeautifulSoup提取HTML标签的
rating-value属性值 让我来帮你解决这个问题——你之前的写法之所以失败,是因为对BeautifulSoup选择元素的逻辑理解有点偏差,咱们一步步理清:
先分析你之前的错误
div.rating-value写法错误:这个是CSS类选择器的语法,它会寻找class属性为rating-value的div,但你要找的是带有rating-value这个自定义属性的div,不是class,所以返回None很正常。- 直接取
div['rating-value']触发KeyError:你直接取了results[0]里的第一个div,但这个div大概率没有rating-value属性,自然会报错。
正确的实现方法
我们需要精准定位到带有rating-value属性的div元素,然后提取它的属性值,这里有两种可靠的写法:
方法1:使用find()配合attrs参数
通过attrs指定要查找的属性,确保找到带有rating-value属性的div:
# 在第一个OfferBox里找带有rating-value属性的div rating_div = results[0].find('div', attrs={'rating-value': True}) # 先判断是否找到元素,避免报错 if rating_div: review_rating = rating_div['rating-value'] # 或者用rating_div.get('rating-value') else: review_rating = "暂无评分"
方法2:使用CSS选择器select_one()
CSS选择器里[属性名]可以匹配带有该属性的元素,写法更简洁:
rating_div = results[0].select_one('div[rating-value]') if rating_div: review_rating = rating_div.get('rating-value', "暂无评分") # get方法可以指定默认值 else: review_rating = "暂无评分"
修正后的完整代码
import requests from bs4 import BeautifulSoup import pandas as pd website = 'https://www.laptopsdirect.co.uk/ct/laptops-and-netbooks/laptops?fts=laptops' response = requests.get(website) soup = BeautifulSoup(response.content, 'lxml') results = soup.find_all('div', class_='OfferBox') # 获取产品名称和价格(strip=True去除多余空格换行) name = results[0].find('a', class_='offerboxtitle').get_text(strip=True) price = results[0].find('span', class_='offerprice').get_text(strip=True) # 获取评分 rating_div = results[0].select_one('div[rating-value]') review_rating = rating_div.get('rating-value', "暂无评分") if rating_div else "暂无评分" # 打印结果 print(f"产品名称: {name}") print(f"价格: {price}") print(f"评分: {review_rating}")
额外小提示
- 使用
get_text(strip=True)可以去除文本前后的空格和换行,让输出更整洁。 - 用
get('属性名', 默认值)比直接用['属性名']更安全,即使属性不存在也不会报错,而是返回你指定的默认值。
内容的提问来源于stack exchange,提问作者Peters7
相关产品推荐
相关产品推荐

