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

如何用PHP Goutte仅提取a标签内不含span子标签的文本?

如何用Goutte提取a标签自身文本(排除子元素span的内容)

我刚好碰到过类似的需求,用Goutte抓取的时候,直接取nodeValue确实会把所有子元素的文本都包含进来——比如你例子里会拿到Japan Sun Apple - Fuji 2 per pack,但我们只想要a标签本身的文本。这里有两个实用的解决方案:

方法一:遍历子节点,只提取文本节点内容

这种方法比较直观,通过遍历a标签的所有子节点,只筛选出纯文本类型的节点,忽略掉span这类元素节点:

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.fairprice.com.sg/searchterm/apple');

foreach ($crawler->filter('a.pdt_title') as $node) {
    $titleText = '';
    // 遍历所有子节点,只保留文本节点的内容
    foreach ($node->childNodes as $child) {
        // XML_TEXT_NODE对应的常量值是3,代表纯文本节点
        if ($child->nodeType === XML_TEXT_NODE) {
            $titleText .= trim($child->nodeValue);
        }
    }
    echo $titleText . "\n";
}

方法二:用XPath直接选取目标文本节点

Goutte的Crawler支持XPath查询,我们可以直接用XPath定位到a标签下的直接文本子节点,一步到位排除子元素的内容:

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.fairprice.com.sg/searchterm/apple');

// 使用XPath选取所有a.pdt_title下的直接文本节点
$titles = $crawler->filterXPath('//a[@class="pdt_title"]/text()');
foreach ($titles as $textNode) {
    $cleanText = trim($textNode->nodeValue);
    // 过滤掉空的文本节点(比如多余的空格或换行)
    if (!empty($cleanText)) {
        echo $cleanText . "\n";
    }
}

这两种方法都能帮你拿到想要的Japan Sun Apple - Fuji文本,XPath的写法更简洁,而遍历子节点的方式适合需要更精细控制文本拼接的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:31:26