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

Selenium爬取uk.hotels.com评论遇AttributeError无法获取class属性值求助

Selenium爬取酒店评论报错修复方案

报错根因与直接修复

AttributeError: 'WebElement' object has no attribute 'findElements'报错的原因是语法混用:Python版本Selenium的元素查找方法为下划线命名规则,没有驼峰格式的findElements方法,单元素查找用find_element(),多元素查找用find_elements()。
你代码中错误的两行需要修改为:

rating = container[j].find_element(By.XPATH, '//*[@id="modal-panel-property-reviews-0"]/section/div/div[2]/div[1]/span[1]').text
review = container[j].find_element(By.XPATH, '//*[@id="modal-panel-property-reviews-0"]/section/div/div[3]/ul/li[1]/p[1]').text

同时注意把代码中所有转义字符"替换为正常的双引号"。

爬取逻辑优化(适配动态class、多评论遍历)

原有逻辑还有多处问题会导致爬取不到对应数据,同步优化如下:

  • 原container获取的是评论列表的整个ul容器,全局只有1个,循环遍历无法拿到单条评论,需要先定位所有单条评论的li节点
  • 提取单条评论内部的字段时,xpath开头要加.,表示从当前评论节点下查找,否则永远只能拿到页面第一条评论的内容
  • 酒店名称、地址、平均分属于全局固定字段,不需要放到评论循环内重复查询,放在循环外获取一次即可
  • 适配class取值不固定的场景,使用contains()语法匹配部分class特征,避免绝对xpath失效
    优化后的核心逻辑参考:
# 全局字段只获取一次
Hotel_Address = driver.find_element(By.XPATH, '//*[@id="overview1"]/div[2]/section[1]/section/div/div/div/span/span[2]').text
Average_Score = driver.find_element(By.XPATH, '//*[@id="seoReviews4"]/div/div[1]/div/span[1]').text
Hotel_Name = driver.find_element(By.XPATH, '//*[@id="main"]/div[2]/div/div/section[2]/div[1]/div[1]/h1').text
Oorsprong = 'Webscraper'  

for i in range(0, num_page):
    time.sleep(2)
    # 获取当前页所有单条评论
    review_items = driver.find_elements(By.XPATH, '//*[@id="modal-panel-property-reviews-0"]/section/div/div[3]/ul/li')
    for item in review_items:
        # 相对xpath+contains适配动态class
        rating = item.find_element(By.XPATH, './/span[contains(@class, "rating")]').text
        review = item.find_element(By.XPATH, './/p[contains(@class, "review")]').text
        scrapedReviews.append([Hotel_Address,Average_Score, Hotel_Name,review,rating,Oorsprong]) 
    # 翻页逻辑
    time.sleep(5)       
    driver.find_element(By.XPATH, '//*[@id="modal-panel-property-reviews-0"]/section/div/div[3]/div/button').click()

额外注意事项

  • 新版Selenium已经废弃find_element_by_xpath写法,建议统一用find_element(By.XPATH, 路径)的语法避免后续版本兼容报错
  • 尽量替换掉所有绝对路径xpath,改用带特征的相对xpath,爬取稳定性会高很多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:01