Beautiful Soup提取含'Overall rating:'文本行对应星级评价的img src数量
问题解决
你当前写的代码缺少核心的行匹配判断环节:无差别收集所有行下class="review3"的td元素,没有先过滤出包含“Overall rating:”文本的目标行,自然没法精准拿到对应行的评分数值。可以按照下面的逻辑实现:
核心实现思路
- 遍历每一个
<tr>元素时,先在当前行的范围内做文本匹配,确认该行class="review2"的td元素是否为“Overall rating:”对应的行 - 匹配成功后,再在同一个tr的作用域内查找所有
<img>标签,标签的数量就是对应的评分值
可直接运行的示例代码
from bs4 import BeautifulSoup # 替换为你实际抓取到的网页HTML内容 html_doc = ''' <tr> <td class="review2" width="23%"> Overall rating: </td> <td> </td> <td class="review3"> <img hight="18px" src="/img/red_star.gif" width="18px" /> <img hight="18px" src="/img/red_star.gif" width="18px" /> </td> </tr> <tr> <td class="review2" > Effectiveness: </td> <td> </td> <td class="review3" > Highly Effective </td> </tr> ''' soup = BeautifulSoup(html_doc, 'html.parser') overall_rating = 0 # 逐行遍历所有tr元素 for tr in soup.find_all('tr'): # 查找当前行内class为review2的标签 review_label = tr.find('td', class_='review2') # 跳过无对应标签的无效行,用strip去掉文本前后多余空白后做匹配 if review_label and review_label.get_text(strip=True) == 'Overall rating:': # 在当前行范围内查找所有img标签,计数即为评分 star_imgs = tr.find_all('img') overall_rating = len(star_imgs) print(f"获取到的总评分为:{overall_rating} 星")
实用调整提示
- 查找元素时一定要用当前循环的
tr作为查找起点,不要全局用soup.find查找,避免串到其他行的内容 - 如果实际网页中“Overall rating:”后附带了其他冗余文本,没法做到完全相等匹配,可以把判断条件改成包含匹配:
兼容性更强,不会因为多余字符导致匹配失败。if review_label and 'Overall rating:' in review_label.get_text(strip=True):
内容的提问来源于stack exchange,提问作者Ash15
相关产品推荐
相关产品推荐

