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

为什么使用BeautifulSoup无法获取Airbnb页面中指定类名的div元素?

无法定位元素的核心原因
  • 动态渲染问题:Airbnb的房源列表内容是浏览器端通过JavaScript动态渲染生成的,你直接用requests.get发起的静态HTTP请求只能拿到初始的HTML骨架,JS还没执行填充内容,自然不存在类名为_8s3ctt的div元素。
  • 反爬拦截:Airbnb有成熟的反爬机制,无伪装的requests请求很容易被识别为爬虫,返回的实际是验证码页面、验证拦截页而非正常的搜索结果页,自然找不到目标元素。
  • 类名不稳定:Airbnb前端使用CSS-in-JS类生成方案,_8s3ctt这种带哈希后缀的类名是动态生成的,不同访问时段、不同地区、不同会话的类名可能都会发生变化,依赖这类类名定位本身就不可靠。
解决方法
  • 替换静态请求为JS渲染工具:使用Selenium、Playwright等模拟真实浏览器的工具发起请求,等待页面完全加载后再提取元素,示例代码如下:
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

def extract_listing(page_url):
    driver = webdriver.Chrome() # 需提前安装Chrome和对应版本的ChromeDriver
    driver.get(page_url)
    # 等待房源卡片元素加载完成,优先用更稳定的data-testid属性定位
    wait = WebDriverWait(driver, 10)
    listings = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div[data-testid="listing-card"]')))
    # 提取内部链接
    urls = []
    for listing in listings:
        link = listing.find_element(By.CSS_SELECTOR, 'a[role="link"]')
        urls.append(link.get_attribute('href'))
    driver.quit()
    return urls
  • 增加请求伪装:如果坚持用requests,需要先在浏览器中拿到正常访问的请求头,补充User-Agent、Cookie、Referer、Accept-Language等完整头信息,尽量模拟真实用户的请求,拿到正确的返回内容后再解析。拿到返回内容后可以先保存为本地HTML文件,确认是否存在目标元素再做后续解析。
  • 替换定位规则:不要依赖动态哈希类名,改用Airbnb页面上固定的data-testid属性、元素语义属性(比如aria-label)或者结构层级定位,稳定性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:57:04