PHP Simple HTML DOM Parser — как получить цены из класса div

#php #parsing

#php #синтаксический анализ

Вопрос:

Я пытаюсь получить цены с <div class="field-item even"> этого веб-сайта, но получаю только белый экран и, похоже, не могу понять, почему это не удается.

Ниже приведен мой код, пытающийся достичь этого:

 <?php
    header("Content-types: text/html; charset=utf8");
    include('simple_html_dom.php');
    $html = file_get_html('https://raceskis.ski-depot.com/products/skis');

    $price['ski'] = $html->find('.field-item even');

    echo $price['ski'];
    print_r($price);
  

Как я могу успешно это сделать?

Комментарии:

1. Убедитесь, что php имеет доступ к целевому веб-сайту. $html должно иметь значение.

Ответ №1:

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

Здесь у вас есть базовый пример получения данных из divs с классом ‘field-item even’.

 <?php

$html = file_get_contents("https://raceskis.ski-depot.com/products/skis");

$doc = new DOMDocument();
$doc->loadHTML($html);

$xpath = new DomXPath($doc);

$nodeList = $xpath->query("//div[@class='field-item even']");

print_r($nodeList);

foreach($nodeList as $node){
  echo "<p>" . $node->nodeValue . "</p>";
}
  

Результат таков:

Объект DOMNodeList ([длина] => 97) 

1

0

Fischer RC4 Superior RC с лыжами для привязки 2014

В наличии

$900.00

$399.00

1

0

Чемпионат мира по футболу Fischer SC с лыжными гонками 2015

В наличии

$1,250.00

$499.00

1

0

Теперь вы можете отфильтровать эту информацию, чтобы получить только цены.

 $pricesArray = [];

foreach($nodeList as $node){

  $nodeValue = $node->nodeValue;

  // If $nodeValue has content and its first character is $
  if($nodeValue amp;amp; $nodeValue[0] == '$'){
    $pricesArray[] = $nodeValue;
  }
}

echo "<pre>";
print_r($pricesArray);
echo "</pre>";
  

Результат таков:

Массив
(
 [0] => $900.00
 [1] => $399.00
 [2] => $1,250.00
 [3] => $499.00
 [4] => $550.00
 [5] => $275.00
 [6] => $900.00
 [7] => $375.00
 [8] => $1,200.00
 [9] => $599.00
 [10] => $1,065.00
 [11] => $499.00
 [12] => $550.00
 [13] => $275.00
 [14] => $1,125.00
 [15] => $549.00
 [16] => $1,125.00
 [17] => $549.00
 [18] => $1,250.00
 [19] => $549.00
 [20] => $550.00
 [21] => $275.00
 [22] => $1,065.00
 [23] => $599.00
)