使用PHP和XPath从ASP网页解析值

时间:2017-12-30 13:35:54

标签: php asp.net parsing curl xpath

我正试图抓住这个网页......

http://prontosoccorso.usl4.toscana.it/attesa/home.asp

enter image description here

使用PHP和XPath获取红色,黄色,绿色和白色圆圈下的数字值。

(注意:如果您尝试浏览它,您可以在该页面中看到不同的值......这无关紧要......,它会改变它的形式......)

我正在尝试使用此PHP代码示例来打印值...

<?php
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

    $url = 'http://prontosoccorso.usl4.toscana.it/attesa/home.asp';

    $xpath_for_parsing = '[@id="prontosoccorso"]/tbody/tr[2]/td[2]';

    //#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 =  'N.D.';
    foreach( $colorWaitingNumber as $node )
    {
      $theValue = $node->nodeValue;
    }

    print $theValue;
?>

代码工作正常但结果总是 0 !!

我注意到如果你使用

    $xpath_for_parsing = '[@id="prontosoccorso"]';

结果是

Situazione aggiornata al giorno 30/12/2017 alle ore 14:09 Rosso Giallo Verde Azzurro Bianco Pazienti in attesa(totale 0)0 0 0 0 0 Pazienti in visita(totale 0)0 0 0 0 0 Pazienti trattati nelle ultime ore 0 0 0 0 0

所以我的值的结果 0 是连贯的(如果你从命令行尝试以下curl http://prontosoccorso.usl4.toscana.it/attesa/home.asp,你会注意到这些值都是零....)

使用浏览器控制台进行分析我无法找到获得实际值的请求.....任何帮助/建议?

提前谢谢..

1 个答案:

答案 0 :(得分:1)

有一点需要注意的是,即使你去那个网页,你也可以在所有字段中开始使用0,这就是为什么我尝试将页面加载两次。这仍然没有用,所以我然后把它存储在调用之间,并且值开始出现。

代码主要是你拥有的,有额外的curl_setopt()调用来创建一个cookie文件(可能能够做到这一次并且总是有效 - 不要引用我的话)。

XPath只会获取第一行字段,但这可以很容易地适应其他行。

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

$url = 'http://prontosoccorso.usl4.toscana.it/attesa/home.asp';

//#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, '');
$cookies = "./cookie.txt";
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies);

$data = curl_exec($ch);
$data = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument();
$dom->loadHTML($data);

$xpath = new DOMXPath($dom);
$xpath_for_parsing = '//table[@id="prontosoccorso"]/tbody/tr[2]/td';

$colorWaitingNumber = $xpath->query($xpath_for_parsing);

$theValue =  'N.D.';
foreach( $colorWaitingNumber as $node )
{
    echo $theValue = $node->nodeValue.PHP_EOL;
}

您可以添加一些逻辑来检查所有值是否为0以重新加载页面。但是这段代码只调用curl_exec()两次。