Разбор HTML-страницы с использованием curl и xpath в PHP

Мне нужно разобрать эту веб-страницу https://www.galliera.it/118, получая цифры под цветными полосками.

Это мой код (это не работает !!) …

<?php ini_set('display_errors', 1); $url = 'https://www.galliera.it/118'; print "The url ... ".$url; echo '<br>'; echo '<br>'; //#Set CURL parameters ... $ch = curl_init(); curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($ch, CURLOPT_PROXY, ''); $data = curl_exec($ch); curl_close($ch); //print "Data ... ".$data; //echo '<br>'; //echo '<br>'; $dom = new DOMDocument(); @$dom->loadHTML($data); $xpath = new DOMXPath($dom); // This is the xpath for a number under a bar .... // /html/body/div[2]/div[1]/div/div/ul/li[6]/span // How may I get it? // The following code doesn't work, it's only to show my goals .. $greenWaitingNumber = $xpath->query('/html/body/div[2]/div[1]/div/div/ul/li[6]/span'); $theText = (string).$greenWaitingNumber; print "Data ... ".$theText; echo '<br>'; echo '<br>'; ?> 

Любые предложения / примеры / альтернативы?

Related of "Разбор HTML-страницы с использованием curl и xpath в PHP"

Вот ваш php-скрипт, который представляет собой запрос на интеллектуальную обработку данных в хорошо отсортированном массиве, вы можете увидеть результаты сценария и изменить структуру по мере необходимости. Ура!

 $html = file_get_contents("https://www.galliera.it/118"); $dom = new DOMDocument(); $dom->loadHTML($html); $finder = new DOMXPath($dom); // find all divs class row $rows = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' row ')]"); $data = array(); foreach ($rows as $row) { $groupName = $row->getElementsByTagName('h2')->item(0)->textContent; $data[$groupName] = array(); // find all div class box $boxes = $finder->query("./*[contains(concat(' ', normalize-space(@class), ' '), ' box ')]", $row); foreach ($boxes as $box) { $subgroupName = $box->getElementsByTagName('h3')->item(0)->textContent; $data[$groupName][$subgroupName] = array(); $listItems = $box->getElementsByTagName('li'); foreach ($listItems as $k => $li) { $class = $li->getAttribute('class'); $text = $li->textContent; if (!strlen(trim($text))) { // this should be the graph bar so kip it continue; } // I see only integer numbers so I cast to int, otherwise you can change the type or event not cast it $data[$groupName][$subgroupName][] = array('type' => $class, 'value' => (int) $text); } } } echo '<pre>' . print_r($data, true) . '</pre>'; 

и вывод – это что-то вроде:

 Array ( [SAN MARTINO - 15:30] => Array ( [ATTESA: 22] => Array ( [0] => Array ( [type] => rosso [value] => 1 ) [1] => Array ( [type] => giallo [value] => 12 ) [2] => Array ( [type] => verde [value] => 7 ) [3] => Array ( [type] => bianco [value] => 2 ) ) [VISITA: 45] => Array ( [0] => Array ( [type] => rosso [value] => 5 ) ... 

Это может помочь упростить ваш оператор xpath для этого конкретного экземпляра.

Это найдет все элементы li с атрибутом класса, соответствующим «verde», который имеет элемент span под ним.

// обозначение означает «соответствие на любом уровне в документе», поэтому вам не нужно создавать свой запрос из корневого

 /* @var $node DOMElement */ $greenWaitingNumber = $xpath->query('//li[@class="verde"]/span'); foreach( $greenWaitingNumber as $node ) { echo $node->nodeValue; } 

* note, это не будет иметь дело с class="verde foo bar"


Если вас интересует только одно значение …

 $greenWaitingNumber = $xpath->query('/html/body/div[2]/div[1]/div/div/ul/li[6]/spa‌​n'); $theText = $greenWaitingNumber[0]->nodeValue; 

Это напечатает "2"