Как правильно спарсить элемент в simple_html_dom

116
28 августа 2019, 04:10

Пытаюсь спарсить цену с сайта (по class="detail-price-uah"), но она грузится не на все указанные товары, то есть к одним товарам грузится к другим нет. И с каждым запуском меняется, то есть сейчас у этого товара цена подгрузилась, перезапустил парсер, уже у него цены нет, но есть у другого товара.

На сколько я понял цена на сайте исходнике подгружается из скрипта, но рядом лежит <meta itemprop="price" content="399"> Здесь значение content="399" и есть нужная мне цена, то есть "399".

Но добраться до этого content я никак не могу. Как это можно сделать? Или как можно подгрузить данные прямо из скрипта?

Видел что вроде бы можно как то регуляркой все что нужно вытянуть, но никак пока не пойму как ее написать.

Возможно задаю глупые вопросы, я только начинаю изучать это все.

Мой код парсера:

<?php
header('Content-Type: text/html; charset=utf-8');
include_once('lib/curl_queri.php');
include_once('lib/simple_html_dom.php'); 
$html = curl_get('https://rozetka.com.ua/uslugi/c153670/'); //подключаюсь к сайту донору
$dom = str_get_html($html); //получаю код страницы
$services = $dom->find('.g-i-tile-i-title'); //ищу на странице товары (сервисы)
foreach($services as $service){
    $a = $service->find('a', 0); //сохраняю ссылки на сервисы
    $one = curl_get($a->href); //перехожу на страницу по сохраненной ссылке
    $one_dom = str_get_html($one); //получаю код страницы
    $price = $one_dom->find('.detail-price-uah'); //ищу на странице цену по классу
    echo $price . ' --- ' . $a->href . '<br>'; //вывожу цены и ссылки на сервисы
}
?>
Answer 1

Если мой коммент к вопросу расписать более подробно, то получается нечто вроде такого.

$content = file_get_contents("https://rozetka.com.ua/uslugi/c153670/");
$html = str_get_html($content);
$result = [];
$items = $html->find(".g-i-tile-i-box-desc");
foreach($items as $item){
    $href  = $item->find(".g-i-tile-i-title a", 0)->href;
    $price = null;
    $script = $item->find('script', 0)->innertext;
    if(preg_match("/pricerawjson\\s=\\s'(.*?)'/", $script, $matches)){
        $json = urldecode($matches[1]);
        $data = json_decode($json, true);
        $price = $data['price'];
    }

    $result[] = ['href' => $href, 'price' => $price];
}

print_r($result);
READ ALSO
sort и двумерный массив

sort и двумерный массив

Вот двумерный массив:

151
Проблема с разбитием строки

Проблема с разбитием строки

Вроде бы изначально казалось что простое задание, но почему-то не получается добиться оптимального результата

118
Проблема при выводе ответа

Проблема при выводе ответа

Есть задача: в файле 20 чисел,и надо вывести:

106
Почему std::count() возвращает знаковое число?

Почему std::count() возвращает знаковое число?

Почему алгоритм std::count() возвращает difference_type, ведь это знаковое число, а количество вхождений чего-то во что-то может быть 0+, те

131