Извлечение строки в HTML-странице с помощью соскабливания в PHP-xpath

Мне нужно очистить эту страницу HTML …

https://www.sanita.puglia.it/monitorpo/aslfg/monitorps-web/monitorps/monitorPSperASL.do?codNazionale=160115

введите описание изображения здесь

…. используя PHP и XPath, чтобы получить значение 10 в зеленом поле под таблицей « PO G. TATARELLA-CERIGNOLA ».

(ПРИМЕЧАНИЕ: вы можете увидеть другое значение на этой странице, если попытаетесь просмотреть его … это не имеет значения .., он меняет динамически ….)

Я использую этот образец кода PHP для печати значения …

<?php ini_set('display_errors', 'On'); error_reporting(E_ALL); $url = 'https://www.sanita.puglia.it/monitorpo/aslfg/monitorps-web/monitorps/monitorPSperASL.do?codNazionale=160115'; $xpath_for_parsing = '/html/body/div[4]/table/tbody/tr[2]/td[4]/div'; //#Set CURL parameters: pay attention to the PROXY config !!!! $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); $dom = new DOMDocument(); @$dom->loadHTML($data); $xpath = new DOMXPath($dom); $colorWaitingNumber = $xpath->query($xpath_for_parsing); $theValue = 'ND'; foreach( $colorWaitingNumber as $node ) { $theValue = $node->nodeValue; } print $theValue; ?> 

Таким образом, я получаю « ND » как вывод не « 10 », как я полагаю.

Исходный код страницы следующий …

введите описание изображения здесь

В моем коде я бы не использовал «абсолютный xpath», поэтому я попытался использовать синтаксис вроде (я знаю, что он не работает, но я довольно новичок с xpath …)

 $xpath_for_parsing = '//*[div="cRiga3 boxtriageS"]'; 

но результат всегда один и тот же.

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

Я думаю, что следующее должно помочь немного – вам нужно будет настроить запрос XPath, возможно, нацелиться на конкретную таблицу и, следовательно, на конкретное содержимое ячейки, но основной код, похоже, работает нормально. Проблема, которую я подозреваю с исходным кодом, заключалась в том, что URL-адрес https который обычно требует дополнительных настроек конфигурации при создании запроса на завивание. В функции curlrequest есть настройки, которые можно удалить, я просто скопировал их из другого скрипта, где у меня были эти настройки.

Измените путь к $cacert на копию cacert.pem в вашей системе или в live-версию на curl.haxx.se

 $url = 'https://www.sanita.puglia.it/monitorpo/aslfg/monitorps-web/monitorps/monitorPSperASL.do?codNazionale=160115'; function _curlrequest( $url=null, $options=null ){ $cacert='c:/wwwroot/cacert.pem'; $vbh = fopen('php://temp', 'w+'); $res=array( 'response' => null, 'verbose' => null, 'info' => array( 'http_code' => 100 ), 'headers' => null, 'errors' => null ); if( is_null( $url ) ) return (object)$res; session_write_close(); /* Initialise curl request object */ $curl=curl_init(); if( parse_url( $url,PHP_URL_SCHEME )=='https' ){ curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, true ); curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 2 ); curl_setopt( $curl, CURLOPT_CAINFO, $cacert ); } /* Define standard options */ curl_setopt( $curl, CURLOPT_URL,trim( $url ) ); curl_setopt( $curl, CURLOPT_AUTOREFERER, true ); curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true ); curl_setopt( $curl, CURLOPT_FAILONERROR, true ); curl_setopt( $curl, CURLOPT_HEADER, false ); curl_setopt( $curl, CURLINFO_HEADER_OUT, false ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_BINARYTRANSFER, true ); curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT, 20 ); curl_setopt( $curl, CURLOPT_TIMEOUT, 60 ); curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' ); curl_setopt( $curl, CURLOPT_MAXREDIRS, 10 ); curl_setopt( $curl, CURLOPT_ENCODING, '' ); curl_setopt( $curl,CURLOPT_VERBOSE,true ); curl_setopt( $curl,CURLOPT_NOPROGRESS,true ); curl_setopt( $curl,CURLOPT_STDERR,$vbh ); /* Assign runtime parameters as options */ if( isset( $options ) && is_array( $options ) ){ foreach( $options as $param => $value ) curl_setopt( $curl, $param, $value ); } /* Execute the request and store responses */ $res=(object)array( 'response' => curl_exec( $curl ), 'info' => (object)curl_getinfo( $curl ), 'errors' => curl_error( $curl ) ); rewind( $vbh ); $res->verbose=stream_get_contents( $vbh ); fclose( $vbh ); curl_close( $curl ); return $res; } function getdom( $data=false, $debug=false ){ try{ if( !$data )throw new Exception('No data passed whilst trying to invoke DOMDocument'); libxml_use_internal_errors( true ); $dom = new DOMDocument(); $dom->validateOnParse=false; $dom->standalone=true; $dom->strictErrorChecking=false; $dom->recover=true; $dom->formatOutput=false; $dom->loadHTML( $data ); $errors=libxml_get_errors(); libxml_clear_errors(); return !empty( $errors ) && $debug ? $errors : $dom; }catch( Exception $e ){ echo $e->getMessage(); } } $obj=_curlrequest( $url ); if( $obj->info->http_code==200 ){ $dom=getdom( $obj->response ); $xp=new DOMXPath( $dom ); $query='//div[ contains( @class,"cRiga3 boxtriageS" ) ]'; $col=$xp->query( $query ); if( !empty( $col ) && $col->length > 0 ){ foreach( $col as $node )echo $node->nodeValue . '<br />'; } } 

Эти результаты

 2 20 37 >1h 1 2 24 10 5 7 32 29 0 3 25 5 0 0 6 2