Я пытаюсь оценить рейтинг сайтов обзора, используя Laravel 4 и Symfony DomCrawler.
Давайте возьмем этот сайт в качестве примера: http://estorereview.com.au/s/5951/A-Supplements
Я хочу получить 4,8 5 звезд
Это частичный код моей попытки:
<?php
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\CssSelector\CssSelector;
function getRatingEstoreReview($url){
$html = getHtmlCurl($url);
$crawler = new Crawler($html);
$crawler = $crawler->filter('span[itemprop="ratingValue"]');
var_dump($crawler);
die("test");
return normalize($crawler,5);
}
Var_dump возвращает следующее:
object(Symfony\Component\DomCrawler\Crawler)[280]
protected 'uri' => null
private 'defaultNamespacePrefix' => string 'default' (length=7)
private 'namespaces' =>
array (size=0)
empty
Я пробовал это с другими сайтами и т. Д., Но я всегда получаю пустой объект. Доступ к значению с $crawler->first
не работает так же хорошо.
Что я делаю неправильно? Спасибо.
Изменить: Даже если я фильтрую для «div», Crawler остается пустым.
PHP Simple HTML DOM Parser работает нормально
Полный путь CSS для этого элемента body > div:nth-child(3) > div > div > div.left-container.floatl > div.top > div.top-inner > div.store-rating-container.floatl > div.star-col.floatl.overall-rating-stars > div.rating-text.floatl > div > strong > span
, Вы пытались использовать это как термин фильтра вместо этого?
Вы также можете использовать filterXPath()
вместо этого, в этом случае вы ищете /html/body/div[3]/div/div/div[4]/div[1]/div[2]/div[2]/div[1]/div[2]/div/strong/span
,
Изменить: это не похоже, что это относится к этой конкретной странице, но просто хотел бы упомянуть «поймал» для веб-сканирования. Помните, что для некоторых веб-страниц содержимое будет обрабатываться (пост-загрузка) JavaScript. В этом случае искомые элементы могут вообще не быть видны DomCrawler.
Обновить:
Вот результаты, которые я вижу. я использую Goutte скорее, чем getHtmlCurl()
,
Код:
use Goutte\Client;
use Symfony\Component\DomCrawler\Crawler;
$client = new Client();
$crawler = $client->request('GET', 'http://estorereview.com.au/s/5951/A-Supplements');
var_dump($crawler->filter('span[itemprop="ratingValue"]'));
echo $crawler->filter('span[itemprop="ratingValue"]')->text();
die("<br />test completed");
Выход:
object(Symfony\Component\DomCrawler\Crawler)[177]
protected 'uri' => string 'http://estorereview.com.au/s/5951/A-Supplements' (length=47)
private 'defaultNamespacePrefix' => string 'default' (length=7)
private 'namespaces' =>
array (size=0)
empty
4.8
test completed
Итак, это работает.
Других решений пока нет …