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

使用Puppeteer抓取温德姆酒店网站距离数据失败求助

解决温德姆酒店网站距离数值抓取问题

酒店列表距离显示截图

问题原因

你之前的代码返回空列表,核心问题有两个:

  • 选择器定位错误:距离元素并不在hotel-address的相邻span节点下,原选择器匹配不到目标元素。
  • 无效CSS语法:span:nth-child(0)不合法,CSS子元素计数从1开始,不存在第0个节点。

解决方案

1. 等待动态元素加载

页面酒店列表为动态渲染,必须先等待目标元素加载完成,再执行抓取:

// 等待距离元素加载完毕
await page.waitForSelector('div[class^="cmp-property-card"] .cmp-property-distance');

2. 精准抓取并提取距离信息

使用正确的选择器定位距离元素,再通过正则提取数值和单位,避免文本不一致:

const distances = await page.$$eval('div[class^="cmp-property-card"] .cmp-property-distance', elements => 
  elements.map(el => {
    // 匹配"25.9 mi"或"10 km"这类格式
    const match = el.textContent.trim().match(/(\d+\.\d+|\d+) (mi|km)/);
    return match ? {
      value: parseFloat(match[1]),
      unit: match[2]
    } : null;
  }).filter(item => item !== null) // 过滤无效数据
);

3. 处理滚动加载(可选)

如果酒店列表需要滚动加载更多内容,可添加滚动逻辑确保抓取全部数据:

// 滚动页面加载所有酒店
await page.evaluate(async () => {
  await new Promise(resolve => {
    let scrollTotal = 0;
    const step = 100;
    const timer = setInterval(() => {
      const pageHeight = document.body.scrollHeight;
      window.scrollBy(0, step);
      scrollTotal += step;
      if (scrollTotal >= pageHeight) {
        clearInterval(timer);
        resolve();
      }
    }, 100);
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:05:13