【问题标题】:Parsing values from a ASP web page using PHP and XPath使用 PHP 和 XPath 从 ASP 网页解析值
【发布时间】:2026-01-31 18:20:05
【问题描述】:

我正在尝试抓取此网页...

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

使用 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 矿石 0 0 0 0 0

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

使用浏览器控制台分析我找不到获得真实值的请求.....有什么帮助/建议吗?

提前谢谢你.. .

【问题讨论】:

    标签: php asp.net parsing curl xpath


    【解决方案1】:

    需要注意的一点是,即使您访问该网页,您也会从所有字段中的 0 开始,这就是我尝试加载该页面两次的原因。这仍然不起作用,所以我让它在调用之间存储 cookie,值开始出现。

    代码主要是你所拥有的,有额外的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()

    【讨论】: