Парсинг simple_html_dom

221
20 сентября 2017, 13:32

Добрый день. Проблема конкретно с этим сайтом и не могу понять почему, а так код рабочий. Использую - simple_html_dom

Ошибка - http://prntscr.com/gmib3k А должно работать так (пример этого кода работы с другим сайтом) - http://prntscr.com/gmignt

include "simple_html_dom.php";
ini_set('allow_url_fopen','1');

// Получаем ссылки на товары из категории
$html_category = file_get_html('https://skymec.ru/everyone/accessories/aksessuari-dlja-spark/');
$links = array();
foreach($html_category->find('.item a.image') as $a) {
    $links[] = $a->href;
}
echo "<pre>";
print_r($links);
echo "</pre>";
echo "Товаров - ".count($links);
echo "<br/>";
echo "Кодировка - ".mb_detect_encoding($articles);
$i = 0;
$tovar_number = count($links) - 1;
while ($i <= $tovar_number) {
    $html_product = file_get_html($links[$i++]);
    $links_product = array();
    foreach($html_product->find('html') as $a_product) {
        $links_product['_NAME_'] = $html_product->find('h1',0)->plaintext;
        $links_product['_META_TITLE_'] = $links_product['_NAME_'];
        $links_product['_MODEL_'] =  $links_product['_NAME_'];
        $links_product['_META_KEYWORDS_'] = $html_product->find("meta[name=keywords]",0) ->getAttribute('content');
        $articles[] = $links_product;

    }
}
echo "<pre>";
print_r($articles);
echo "</pre>";
Answer 1

Проблема в том, что вы отключили показ предупреждений пхп и видите только фатальные ошибки.

И вот, что вы теряете:

Warning: file_get_contents(https://skymec.ru/index.php?route=product/product&amp;path=20_68_131&amp;product_id=1465): 
failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

Вторая ваша ошибка, вы смотрите страницу, а не ее исходный код. Браузер маскирует косячные &amp; в ссыслке и показывает их как &, и вам кажется что ссылка нормальная. В действительности же вот они какие:

[0] => https://skymec.ru/index.php?route=product/product&amp;path=20_68_131&amp;product_id=1465
[1] => https://skymec.ru/index.php?route=product/product&amp;path=20_68_131&amp;product_id=1466
[2] => https://skymec.ru/index.php?route=product/product&amp;path=20_68_131&amp;product_id=1467
[3] => https://skymec.ru/index.php?route=product/product&amp;path=20_68_131&amp;product_id=1468
[4] => https://skymec.ru/everyone/spark-dji/aksessuari-dlja-spark-1/kabel-dji-goggles-micro-usb-otg-cable--part6-/
[5] => https://skymec.ru/index.php?route=product/product&amp;path=20_68_131&amp;product_id=1499
[6] => https://skymec.ru/everyone/mavic/aksessuari-dlja-mavic-1/goggles-mavic-sling-bag/
[7] => https://skymec.ru/everyone/mavic/aksessuari-dlja-mavic-1/apark_mavic_part14_shoulder_bag/

Поэтому чтобы нормально открыть ссылку необходимо провести соответствующее преобразование:

$html_product = file_get_html( htmlspecialchars_decode($links[$i++]) );

Правда при включенных нотисах и варнингах у вас сразу же посыпятся уведомления вида:

Notice: Trying to get property of non-object in /home/teran/public_html/index.php on line 26

Т.к. на полученной странице отсутствует искомый тэг h1.

зы: у вас там в тексте какой то непонятный цикл foreach($html_product->find('html') as $a_product) {, который избыточен и лишен смысла.

READ ALSO
Уменьшение размеров картинки и места на диске

Уменьшение размеров картинки и места на диске

Есть строка с картинкой в виде бинарных данных взятых из базы

309
wp вывод статей на статической странице

wp вывод статей на статической странице

Есть код вывода статей на статической странице с постраничной навигацией:

197
Регулярное выражение для BB тега

Регулярное выражение для BB тега

Есть строка вида: [text='15';] Нужно с помощью регулярного выражения и php вытащить число 15

208
Разобрать массив и собрать его новый

Разобрать массив и собрать его новый

ЗдравствуйтеМне нужно сгруппировать значения массива в зависимости от приоритета

349