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

使用Selenium读取CSV中TripAdvisor链接批量抓取酒店信息报错如何修复

代码问题修复方案

现有代码的核心问题

  • start_request函数无有效返回值:browser.get()本身没有返回值,你拿到的text永远是None,属于冗余设计。
  • 元素取值错误:定位到名称元素后没有取.text属性,存入字典的是WebElement对象而非酒店名称文本。
  • 数据追加逻辑错误:result_list.append(mydict)只写在了异常分支里,正常抓取到数据时不会把结果存入列表,导致最终输出为空。
  • 相对xpath写法错误:在父容器下查找子元素时,xpath开头要加.代表当前节点下查找,否则会全局搜索,可能拿到第一个页面的旧数据。
  • 缺少页面等待逻辑:页面还没加载完成就执行元素查找,大概率会抛出元素不存在的异常。
  • 缺少价格、酒店等级的定位逻辑,Windows下ChromeDriver路径未做转义处理,可能导致驱动启动失败。

修复后的完整代码

!pip install selenium
import pandas as pd
import csv
from time import sleep
from random import randint
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 路径加r前缀避免转义,替换成你自己的chromedriver路径
browser = webdriver.Chrome(executable_path=r'C:\ProgramData\Anaconda3\Lib\site-packages\jupyterlab\chromedriver.exe')
# 全局隐式等待10秒,没找到元素最多等10秒再抛异常
browser.implicitly_wait(10)
result_list=[]

def start_request(q):
    browser.get(q)
    print("正在抓取:"+q)
    # 等待页面核心标题加载完成再执行后续逻辑
    WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, "HEADING")))

def parse():
    mydict = {}
    # 抓取酒店名称
    try:
        mydict['name'] = browser.find_element(By.ID, "HEADING").text.strip()
    except Exception as e:
        print(e)
        mydict['name'] = 'null'
    # 抓取酒店等级,星级元素的aria-label属性自带星级信息
    try:
        star_ele = browser.find_element(By.XPATH, '//*[@data-test-target="hotel-rating"]/svg')
        mydict['star_level'] = star_ele.get_attribute('aria-label').strip()
    except Exception as e:
        print(e)
        mydict['star_level'] = 'null'
    # 抓取价格区间,英文页面请把"价格区间"替换为"Price range"
    try:
        price_ele = browser.find_element(By.XPATH, '//div[contains(text(),"价格区间")]/following-sibling::div')
        mydict['price_range'] = price_ele.text.strip()
    except Exception as e:
        print(e)
        mydict['price_range'] = 'null'
    # 无论是否抓取异常都将当前数据存入结果列表
    result_list.append(mydict)

if __name__ == '__main__':
    with open('Best3HotelsLink.csv', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            req = row['Link']
            start_request(req)
            parse()
            sleep(randint(2,5)) # 加长随机等待时间避免触发反爬机制
    # 导出结果到CSV
    df = pd.DataFrame(result_list)
    df.to_csv('Detailed Hotelinfo.csv', encoding='utf-8-sig', index=False)
    print(df)
    # 抓取完成关闭浏览器
    browser.quit()

额外注意事项

  • 请确保你的Best3HotelsLink.csv文件的链接列名确实为Link,和代码中读取的字段保持一致
  • 建议升级Selenium到4.x版本,旧版本的find_element_by_xpath等方法已经废弃,修复后的代码使用的是Selenium4官方推荐的写法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:54:02