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

Selenium爬取Airbnb触发InvalidSelectorException报错求助

解决Selenium爬取Airbnb房源时的InvalidSelectorException错误

问题根源

  1. By.CLASS_NAME不支持多类名:你传入的'c4mnd7m dir dir-ltr'是多个类名组合,但By.CLASS_NAME仅接受单个类名,空格会被解析为选择器的一部分,直接触发非法选择器错误。
  2. 错误的类名前缀:子元素查找时添加了.前缀(如.ln2bl2p dir dir-ltr),By.CLASS_NAME不需要加.,这也是导致选择器无效的原因。

修正后的代码

改用By.CSS_SELECTOR处理多类名场景,同时修正类名格式问题:

def getListings():
    # 用CSS选择器匹配多类名的房源容器
    listings = browser.find_elements(By.CSS_SELECTOR, 'div.c4mnd7m.dir.dir-ltr')
    for listing in listings:
        # 匹配房源链接元素
        link_elem = listing.find_element(By.CSS_SELECTOR, 'a.ln2bl2p.dir.dir-ltr')
        link = link_elem.get_attribute('href')
        # 匹配价格元素
        price = listing.find_element(By.CSS_SELECTOR, 'span.a8jt5op.dir.dir-ltr').text
        print(link, price)

额外优化建议

  • 处理动态加载:Airbnb房源是动态渲染的,建议加入等待逻辑避免元素未加载完成的问题:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def getListings():
    # 等待房源容器加载完成,最长等待10秒
    WebDriverWait(browser, 10).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.c4mnd7m.dir.dir-ltr'))
    )
    listings = browser.find_elements(By.CSS_SELECTOR, 'div.c4mnd7m.dir.dir-ltr')
    for listing in listings:
        try:
            link_elem = listing.find_element(By.CSS_SELECTOR, 'a.ln2bl2p.dir.dir-ltr')
            link = link_elem.get_attribute('href')
            price = listing.find_element(By.CSS_SELECTOR, 'span.a8jt5op.dir.dir-ltr').text
            print(link, price)
        except Exception:
            # 跳过加载异常的房源
            continue
  • 选择器稳定性:Airbnb的类名是动态生成的,后续可能失效,建议改用更稳定的选择逻辑,比如通过元素属性(如[href*="/rooms/"]匹配房源链接)或层级关系定位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:01:08