PHP简单html dom返回json

时间:2019-01-28 17:12:11

标签: php json curl simple-html-dom

我正在尝试使用cURL和Simple Html Dom Parser处理php抓取,但是在返回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);

现在工作起来就像一个小玩意儿:

$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 :(得分:0)

$imgCrt = $img->src;是对象还是数组?

尝试$imgCrt = $img['src'];

答案 1 :(得分:0)

如果您使用的是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

答案 2 :(得分:0)

您在->find调用中找不到任何元素,这就是为什么您遇到这些错误的原因。 Simple html解析器在find方法中使用CSS选择器,您要搜索的属性中包含空格,因此必须将其引起引用。
除非您指定索引,否则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
    ];
}

答案 3 :(得分:0)

检查find()是否在foreach循环内返回数据

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

print_r($finder);
print_r($key);