尝试使用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);
答案 0 :(得分:0)
使用curl或xpath需要考虑一些特殊内容吗?
正如你实际上问的那样,我认为你可以从让自己变得更加舒适的事情中获益,那就是关于什么是什么,xpath是什么,以及两者是相关的,哪些都不相关。
代码有效,只是这个很难调试的漏洞。
嗯,你在那里的功能很长,一次做太多事情。这就是为什么它也很难调试的原因。将代码从该函数移出到您从该函数调用的子例程中。这也将帮助您更多地构建代码。
此外,您可以记录您的程序所执行的活动。因此,您可以在调试中使用过去请求的完全相同的HTML(因为您已经存储了它)并验证您的xpath查询是否真的适合数据。