PHP Goutte Web Scraping
Я хочу отказаться от этого:
<a class="pdt_title">
Japan Sun Apple - Fuji
<span class="pdt_Tweight">2 per pack</span>
</a>
Это мой код:
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) {
print $node->nodeValue."\n";
}
Я хочу вырезать только текст внутри тега "a" без текста внутри тега "span". Как получить только текст внутри тега "a"?
1 ответ
Глядя на разметку HTML, нужный вам текстовый узел попадает в первый дочерний элемент привязки. Так как каждый $node
это пример DOMElement
, ты можешь использовать ->firstChild
(нацеливаясь на текстовый узел), затем используйте ->nodeValue
:
foreach ($crawler->filter('a.pdt_title') as $node) {
echo $node->firstChild->nodeValue . "\n";
}
Другой альтернативой является использование xpath через ->filterXpath()
, его в документах, кстати:
foreach ($crawler->filterXpath('//a[@class="pdt_title"]/text()') as $text) {
echo $text->nodeValue , "\n";
}
Родственные документы:
https://symfony.com/doc/current/components/dom_crawler.html
Запрос xpath просто нацелен на якорь с этим классом, а затем на текст.
Или другой лайнер. Возвращает массив, извлекающий тексты:
$output = $crawler->filterXpath('//a[@class="pdt_title"]/text()')->extract(array('_text'));
Родственные документы DOM:
http://php.net/manual/en/class.domelement.php
http://php.net/manual/en/class.domnode.php