PHP Goutte Web Scraping - PullRequest
       47

PHP Goutte Web Scraping

0 голосов
/ 14 мая 2018

Я хочу отменить это:

<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 Ответ

0 голосов
/ 14 мая 2018

Глядя на разметку 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

...