DomCrawler Symfony не находит определенный тег

Я использую DomCrawler для получения данных со страницы Google Play, и он работает в 99% случаев, за исключением того, что я наткнулся на страницу, на которой не может найти определенный элемент div. Я проверяю HTML-код, и он определенно там. Мой код

$autoloader = require __DIR__.'\vendor\autoload.php';
use Symfony\Component\DomCrawler\Crawler;

$app_id = 'com.balintinfotech.sinhalesekeyboardfree';

$response = file_get_contents('https://play.google.com/store/apps/details?id='.$app_id);
$crawler = new Crawler($response);
echo $crawler->filter('div[itemprop="datePublished"]')->text();

Когда я запускаю эту конкретную страницу, я получаю

PHP Fatal error: Uncaught InvalidArgumentException: The current node list is empty.

Однако, если я использую любой другой идентификатор, я получаю желаемый результат. Что именно на той странице, которая ломает DomCrawler


person John Baker    schedule 13.09.2017    source источник
comment
Это происходит только на этой странице для вас? Мне удалось заставить его работать: 14 de marzo de 2017 (просто скопировав/вставив ваш код)   -  person ishegg    schedule 13.09.2017
comment
@ishegg Только что на этой странице. Я вижу, вы получили свой результат на испанском языке, так что это влияет только на английскую страницу.   -  person John Baker    schedule 13.09.2017
comment
@ishegg, вы можете попробовать использовать следующий URL-адрес https://play.google.com/store/apps/details?id=com.balintinfotech.sinhalesekeyboardfree&hl=en   -  person John Baker    schedule 13.09.2017


Ответы (1)


Как вы правильно поняли, в английской версии этого нет, а в испанской есть.

Единственное отличие, которое я заметил, это комментарий пользователя, говорящий නියමයි ඈ. Похоже, Ползуна что-то беспокоит. Если вы замените символ null (\x00) пустой строкой, он правильно получит то, что вы ищете:

<?php
$app_id = 'com.balintinfotech.sinhalesekeyboardfree';
$response = file_get_contents('https://play.google.com/store/apps/details?hl=en&id='.$app_id);
$response = str_replace("\x00", "", $response);
$crawler = new Symfony\Component\DomCrawler\Crawler($response);
var_dump($crawler->filter('div[itemprop="datePublished"]')->text()); // string(14) "March 14, 2017"

Я постараюсь изучить это подробнее.

person ishegg    schedule 13.09.2017
comment
Хороший улов, интересно, это ошибка в DomCrawler. Пришлось удалить мой предыдущий ответ, так как кодировка в UTF-8 фактически не работала. - person John Baker; 14.09.2017
comment
Это не. Обратите внимание, что file_get_contents() усекает результат, когда находит нулевой символ, DomCrawler отлично выполняет свою работу. Таким образом, проблема, похоже, находится на стороне PHP. Может даже глубже. - person ishegg; 14.09.2017
comment
это не усекается на моем конце. Я получаю весь HTML. - person John Baker; 14.09.2017