#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 )