【问题标题】:Get rigth Xpath for HTML elements为 HTML 元素获取正确的 Xpath
【发布时间】:2017-10-20 19:09:53
【问题描述】:

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

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

.... 使用 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 Web 控制台提取了 xpath ...

建议/例子?

【问题讨论】:

    标签: php html xpath web-scraping


    【解决方案1】:

    Chrome 和 Firefox 最有可能通过在 &lt;table&gt; 中添加 &lt;tbody&gt; 元素来改进原始 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';
    

    【讨论】:

    • 它现在可以工作了...有什么替代工具可以为我的 HTML 页面元素提取 xpath 吗?
    【解决方案2】:

    与其依赖可能相当脆弱的层次结构(我们有时都发现自己在构建),不如寻找与您要查找的数据相对接近的东西。我刚刚完成了 XPath,但它基本上是从文本“CODICE BIANCO”导航并找到与该字符串相关的数据。

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

    当编码人员更改页面格式时,这仍然是可破坏的,但它会尽可能地本地化代码。

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2018-12-20
      • 2011-07-10
      • 1970-01-01
      相关资源
      最近更新 更多