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

使用Puppeteer时,如何排除querySelector目标元素的嵌套类文本?

解决方法

要获取.pdp_price元素本身的文本(排除嵌套的.price_feature子元素文本),可以用以下几种可靠的方式:

方法一:提取文本节点内容

直接筛选父元素下的文本节点,忽略子元素节点:

const data = await page.evaluate(() => {
  const address = document.querySelector('#app > div > div > article > div.pdp_header > div > div > h1').innerText.replaceAll('\n',',');
  const bed = document.querySelector('.bed')?.innerText || "";
  const bath = document.querySelector('.bath')?.innerText || "";
  const car = document.querySelector('.car')?.innerText || "";
  
  // 提取父元素的文本节点内容
  const priceElement = document.querySelector('.pdp_price');
  const priceText = Array.from(priceElement.childNodes)
    .filter(node => node.nodeType === Node.TEXT_NODE) // 只保留文本节点
    .map(node => node.textContent.trim()) // 去除文本两端空格
    .join(''); // 拼接成完整文本

  return `${address}, ${priceText}, ${bed}, ${bath}, ${car} \n`;
});

方法二:克隆元素并移除子元素

通过克隆父元素,移除嵌套的子元素后再获取文本,避免修改原DOM结构:

const data = await page.evaluate(() => {
  const address = document.querySelector('#app > div > div > article > div.pdp_header > div > div > h1').innerText.replaceAll('\n',',');
  const bed = document.querySelector('.bed')?.innerText || "";
  const bath = document.querySelector('.bath')?.innerText || "";
  const car = document.querySelector('.car')?.innerText || "";
  
  // 克隆元素并移除子元素
  const priceClone = document.querySelector('.pdp_price').cloneNode(true);
  priceClone.querySelector('.price_feature').remove();
  const priceText = priceClone.innerText.trim();

  return `${address}, ${priceText}, ${bed}, ${bath}, ${car} \n`;
});

你之前尝试失败的原因

  • .pdp_price:not(.price_feature) 这个选择器依然会选中.pdp_price元素,:not()是排除自身带有指定类的元素,而非排除子元素。
  • 第二种尝试中,innerText返回的是字符串,不存在remove()方法,逻辑本身不成立。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:25:24