PHP cURL& XPath给出不一致的结果

时间:2015-03-15 15:05:07

标签: php curl xpath

尝试使用url参数进行循环,进入一个执行curl的函数,获取所有html并在其上运行xpath。但结果各不相同。有什么特别的我需要考虑使用curl或xpath吗?有时它会收集一个emtpy字符串。代码工作,只是这个很难调试的缺陷。

这是我使用的代码。

    private function getArticles($url){

    // Instantiate cURL to grab the HTML page.
    $c = curl_init($url);
    curl_setopt($c, CURLOPT_HEADER, false);
    curl_setopt($c, CURLOPT_USERAGENT, $this->getUserAgent());
    curl_setopt($c, CURLOPT_FAILONERROR, true);
    curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($c, CURLOPT_AUTOREFERER, true);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($c, CURLOPT_TIMEOUT, 10);

    // Grab the data.
    $html = curl_exec($c);

    // Check if the HTML didn't load right, if it didn't - report an error
    if (!$html) {
        echo "<p>cURL error number: " .curl_errno($c) . " on URL: " . $url ."</p>" .
             "<p>cURL error: " . curl_error($c) . "</p>";
    }

    // Close connection.
    curl_close($c);

    // Parse the HTML information and return the results.
    $dom = new DOMDocument(); 
    @$dom->loadHtml($html);
    $xpath = new DOMXPath($dom);

    // Get a list of articles from the section page
    $cname = $xpath->query('//*[@id="item-details"]/div/div[1]/h1');        
    $link = $xpath->query('//*[@id="item-details"]/div/ul/li[1]/a/@href');
    $streetadress = $xpath->query('//*[@id="item-details"]/div[2]/div[3]/div[1]/text()[1]');
    $zip = $xpath->query('//*[@id="item-details"]/div[2]/div[3]/div[1]/text()[2]');
    $phone1 = $xpath->query('//*[@id="item-details"]/div/h2/span[2]');
    $phone2 = $xpath->query('//*[@id="item-details"]/div/h2[2]/span[2]');       
    $ceo = $xpath->query('//*[@id="company-financials"]/div/div[2]/span');      
    $orgnr = $xpath->query('//*[@id="company-financials"]/div/div[1]/span');        
    $turnover13 = $xpath->query('//*[@class="geb-turnover1"]');
    $turnover12 = $xpath->query('//*[@class="geb-turnover2"]');
    $turnover11 = $xpath->query('//*[@class="geb-turnover3"]');
    $logo = $xpath->query('//*[@id="item-info"]/p/img/@src');
    $desc = $xpath->query('//*[@id="item-info"]/div[1]/div');

    $capturelink = "";
//  $capturelink = $this->getWebCapture($link->item(0)->nodeValue);

    return array(
    'companyname' => $cname->item(0)->nodeValue, 
    'streetadress' => $streetadress->item(0)->nodeValue,
    'zip' => $zip->item(0)->nodeValue,
    'phone1' => $phone1->item(0)->nodeValue,
    'phone2' => $phone2->item(0)->nodeValue,
    'link' => $link->item(0)->nodeValue,
    'ceo' => $ceo->item(0)->nodeValue,
    'orgnr' => $orgnr->item(0)->nodeValue,
    'turnover2013' => $turnover13->item(0)->nodeValue,
    'turnover2012' => $turnover12->item(0)->nodeValue,
    'turnover2011' => $turnover11->item(0)->nodeValue,
    'description' => $desc->item(0)->nodeValue,
    'logo' => $logo->item(0)->nodeValue,
    'capturelink' => $capturelink);
}
// End Get Articles

编辑:

我真的尝试过这一切。但最终使用phpQuery,现在它的工作原理。我认为php dom和xpath结合并不总是很好的组合。在这种情况下至少对我而言。

这是我如何使用它而不是xpath:

    ....

    require('phpQuery.php');

    phpQuery::newDocumentHTML($html);

    $capture = "";
//  $capture = $this->getWebCapture(pq('.website')->attr('href'));

    return array(       
    'companyname' => pq('.header')->find('h1')->text(),
    'streetadress' => pq('.address-container:first-child')->text(),
    'zip' => pq('.address-container')->text(),
    'phone1' => pq('.phone-number')->text(),
    'phone2' => pq('.phone-number')->text(),
    'link' => pq('.website')->attr('href'),
    'ceo' => pq('.geb-ceo')->text(),
    'orgnr' => pq('.geb-org-number')->text(),
    'turnover2013' => pq('.geb-turnover1')->text(),
    'turnover2012' => pq('.geb-turnover2')->text(),
    'turnover2011' => pq('.geb-turnover3')->text(),
    'description' => pq('#item-info div div')->text(),
    'logo' => pq('#item-info logo img')->attr('src'),
    'capture' => $capture);     

1 个答案:

答案 0 :(得分:0)

  

使用curl或xpath需要考虑一些特殊内容吗?

正如你实际上问的那样,我认为你可以从让自己变得更加舒适的事情中获益,那就是关于什么是什么,xpath是什么,以及两者是相关的,哪些都不相关。

  

代码有效,只是这个很难调试的漏洞。

嗯,你在那里的功能很长,一次做太多事情。这就是为什么它也很难调试的原因。将代码从该函数移出到您从该函数调用的子例程中。这也将帮助您更多地构建代码。

此外,您可以记录您的程序所执行的活动。因此,您可以在调试中使用过去请求的完全相同的HTML(因为您已经存储了它)并验证您的xpath查询是否真的适合数据。