如何用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
相关产品推荐
相关产品推荐

