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

Python Selenium提取谷歌点评单个评论者评分返回None问题求助

问题修正方案

你的代码存在3个核心问题导致评分返回None/运行异常:

  • 变量名不匹配:你定义了存储评论元素的变量为review_info,但循环迭代时写了未定义的person_infos,首先会触发变量未定义报错
  • 元素定位规则失效:谷歌本地点评的页面类名会不定期更新,你使用的PuaHbe类定位、子span取aria-label的规则已经不符合当前页面结构
  • 使用了Selenium已弃用API:find_element_by_*系列方法在Selenium 4.0及以上版本已被正式移除,若使用新版本Selenium会直接触发方法不存在报错

修正后的完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 如果你的Chrome驱动没有配置系统环境变量,可以安装webdriver-manager后替换下面两行:
# from webdriver_manager.chrome import ChromeDriverManager
# driver = webdriver.Chrome(ChromeDriverManager().install())
driver = webdriver.Chrome()
base_url = 'https://www.google.com/search?tbs=lf:1,lf_ui:9&tbm=lcl&sxsrf=AOaemvJFjYToqQmQGGnZUovsXC1CObNK1g:1633336974491&q=10+famous+restaurants+in+Dunedin&rflfq=1&num=10&sa=X&ved=2ahUKEwiTsqaxrrDzAhXe4zgGHZPODcoQjGp6BAgKEGo&biw=1280&bih=557&dpr=2#lrd=0xa82eac0dc8bdbb4b:0x4fc9070ad0f2ac70,1,,,&rlfi=hd:;si:5749134142351780976,l,CiAxMCBmYW1vdXMgcmVzdGF1cmFudHMgaW4gRHVuZWRpbiJDUjEvZ2VvL3R5cGUvZXN0YWJsaXNobWVudF9wb2kvcG9wdWxhcl93aXRoX3RvdXJpc3Rz2gENCgcI5Q8QChgFEgIIFkiDlJ7y7YCAgAhaMhAAEAEQAhgCGAQiIDEwIGZhbW91cyByZXN0YXVyYW50cyBpbiBkdW5lZGluKgQIAxACkgESaXRhbGlhbl9yZXN0YXVyYW50mgEkQ2hkRFNVaE5NRzluUzBWSlEwRm5TVU56ZW5WaFVsOUJSUkFCqgEMEAEqCCIEZm9vZCgA,y,2qOYUvKQ1C8;mv:[[-45.8349553,170.6616387],[-45.9156414,170.4803685]]'
driver.get(base_url)

# 等待最新评论按钮可点击
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//div[./span[text()='Newest']]"))).click()

# 获取总评论数
total_reviews_text = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//span[contains(text(), 'reviews')]"))).text
num_reviews = int(total_reviews_text.split()[0])

# 加载所有评论
all_reviews = WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.gws-localreviews__google-review')))
time.sleep(2)
total_reviews = len(all_reviews)

while total_reviews < num_reviews:
    driver.execute_script('arguments[0].scrollIntoView(true);', all_reviews[-1])
    WebDriverWait(driver, 5, 0.25).until_not(EC.presence_of_element_located((By.CSS_SELECTOR, 'div[class$="activityIndicator"]')))
    time.sleep(2)
    all_reviews = WebDriverWait(driver, 5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.gws-localreviews__google-review')))
    total_reviews = len(all_reviews)
    print(f"已加载评论数:{total_reviews}")

# 提取评分
for review in all_reviews:
    # 定位评分元素,取aria-label属性
    rating_ele = review.find_element(By.XPATH, ".//span[@role='img']")
    rating = rating_ele.get_attribute('aria-label')
    print(rating)

driver.quit()

关键修改说明

  • 修正了变量名不匹配的问题,直接迭代已经加载完成的all_reviews列表,避免重复定位元素
  • 替换了所有已弃用的find_element_by_*方法,使用Selenium 4+支持的find_element(By.定位方式, 路径)写法
  • 修改了评论加载的计数逻辑,直接取当前加载的评论列表长度赋值,避免原逻辑中固定+5导致的加载不全问题
  • 优化了评分元素定位规则:谷歌点评的评分元素都带有role='img'属性,直接从每个评论块内匹配该属性的元素取aria-label,稳定性远高于固定类名定位

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:27:01