为HTML元素获取rigth Xpath

时间:2017-10-20 19:09:54

标签: php html xpath web-scraping

我需要抓取这个HTML页面......

http://www1.usl3.toscana.it/default.asp?page=ps&ospedale=3

enter image description here

....使用PHP和XPath在字符串" CODICE BIANCO"

下获取 0 等值

(注意:如果您尝试浏览它,您可以在该页面中看到不同的值...它并不重要......它们会改变它们的行为......)

我使用此PHP代码示例来打印值...

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

    include "./tmp/vendor/autoload.php";

    $url = 'http://www1.usl3.toscana.it/default.asp?page=ps&ospedale=3';

    //$xpath_for_parsing = '/html/body/div/div[2]/table[2]/tbody/tr[1]/td/table/tbody/tr[3]/td[1]/table/tbody/tr[11]/td[3]/b';

    $xpath_for_parsing = '//*[@id="contentint"]/table[2]/tbody/tr[1]/td/table/tbody/tr[3]/td[1]/table/tbody/tr[11]/td[3]/b';

    //#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;

?>

我已使用Chrome和Firefox网络控制台提取xpath ...

建议/示例?

2 个答案:

答案 0 :(得分:1)

Chrome和Firefox最有可能通过在<tbody>中添加<table>元素来改进原始HTML,因为原始HTML不包含它们。 CURL没有这样做,这就是XPATH失败的原因。试试这个:

$xpath_for_parsing = '//*[@id="contentint"]/table[2]/tr[1]/td/table/tr[3]/td[1]/table/tr[11]/td[3]/b';

答案 1 :(得分:1)

不是依赖于可能非常脆弱的层次结构(我们都发现自己有时会建立),而是可能值得寻找相对接近您所寻找数据的东西。我刚刚完成了XPath,但它基本上是从文本&#34; CODICE BIANCO&#34;并找到相对于该字符串的数据。

$xpath_for_parsing = '//*[text()="CODICE BIANCO"]/../../following-sibling::tr[1]//descendant::b[2]';

当编码器更改页面格式时,这仍然可以破解,但它会尝试尽可能地本地化代码。