PHP простой HTML дом возвращение JSON - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь справиться с пересмотром php, используя cURL и Simple Html Dom Parser, но я застреваю при возвращении формата json.Сайт - бесплатный тестовый веб-сайт ..

function getPage($href) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_URL, $href);
    curl_setopt($curl, CURLOPT_REFERER, $href);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    $str = curl_exec($curl);
    $html = str_get_html($str);
    curl_close($curl);
    return $html;
}

$link = 'https://www.webscraper.io/test-sites/e-commerce/allinone/computers';
$data = getPage($link);

foreach ($data->find('div[class=col-sm-4 col-lg-4 col-md-4]') as $key => $finder) {

    $img = $finder->find('img[class=img-responsive]');
    $imgCrt = $img->src;
    $price = $finder->find('h4[class=pull-right price]');
    $priceCrt = $price->innertext;
    $desc = $finder->find('p[class=description]');
    $descCrt = $desc->innertext;

    $json['status'] = 'ok';

    $json['return'][] = [
      'img' => $imgCrt,
      'price' => $priceCrt,
      'desc' => $descCrt
    ];
}

echo json_encode($json);

Результат:

{"status":"ok","return":[{"img":null,"price":null,"desc":null},{"img":null,"price":null,"desc":null},{"img":null,"price":null,"desc":null}]}

И ошибки ...

https://i.imgur.com/7scD2Yg.png

Строка 43, 45, 47:

43 - $imgCrt = $img->src;
45 - $priceCrt = $price->innertext;
47 - $descCrt = $desc->innertext;

Без этих строк моя страница результатов становится пустой, без ошибок и результатов json .. Заранее спасибо!

РЕШЕНИЕ !!

Во время сброса обнаружил это:

var_dump($finder->find('img')[0]->src);
echo "<br />";
var_dump($finder->find('h4.price')[0]->innertext);
echo "<br />";
var_dump($finder->find('p.description')[0]->innertext);

Теперь работает как Cham в:

$img[$key] = $finder->find('img')[0]->src;
$price[$key] = $finder->find('h4.price')[0]->innertext;
$desc[$key] = $finder->find('p.description')[0]->innertext;

$json['return'][] = [
  'img' => $img[$key],
  'price' => $price[$key],
  'desc' => $desc[$key]
];

Результат: img: https://i.imgur.com/it9ZxEC.png

Спасибо!

Ответы [ 4 ]

0 голосов
/ 28 января 2019

проверьте, возвращает ли find() данные внутри цикла foreach

var_dump($key);
var_dump($finder); 

или

print_r($finder);
print_r($key);
0 голосов
/ 28 января 2019

Если вы используете PHP 7, как только вы подтвердите тип скаляра или вектора вашей переменной, вы можете сделать что-то вроде этого:

$imgCrt = $img['src'] ?? $img->src;

В переводе это будет:

$imgCrt = is_array($img) && !empty($img['src']) ? $img['src'] : $img->src;

Это предполагает, что ваш ключ src в вашей переменной $img.

Пожалуйста, посмотрите мои комментарии о том, как отлаживать, и посмотрите, какие значения и типы значений.

Также запомнитеустановить код ответа HTTP -> http://php.net/manual/en/function.http-response-code.php

0 голосов
/ 28 января 2019

Вы не находите никаких элементов в вашем вызове ->find, поэтому вы получаете эти ошибки.
Простой html-анализатор использует CSS-селекторы в методе find, атрибут, который вы ищете, имеетпоэтому пробелы в нем должны быть заключены в кавычки.
Также find возвращает массив, если не указан индекс

foreach ($data->find('div["class=col-sm-4 col-lg-4 col-md-4"]') as $key => $finder) {

    $img = $finder->find('img[class=img-responsive]', 0);
    $imgCrt = $img->src;
    $price = $finder->find('h4[class="pull-right price"]', 0);
    $priceCrt = $price->innertext;
    $desc = $finder->find('p[class=description]', 0);
    $descCrt = $desc->innertext;

    $json['status'] = 'ok';

    $json['return'][] = [
      'img' => $imgCrt,
      'price' => $priceCrt,
      'desc' => $descCrt
    ];
}
0 голосов
/ 28 января 2019

Является ли $imgCrt = $img->src; объектом или массивом?

try $imgCrt = $img['src'];

...