2012-03-12 84 views
3

我剛剛知道什麼scrapping和cUrl是在幾個小時前,從那以後我玩了。儘管如此,我現在面臨一些奇怪的事情。下面的代碼可以在一些網站上正常工作,而不是與其他網站一起工作(當然我修改了url和xpath ...)。請注意,當我測試curl_exec是否正確執行時,我沒有提出錯誤。所以這個問題必須來自某個地方。我的一些問題如下:PHP刮擦捲曲 - 我如何調試

  1. 我如何檢查,如果新的DOM文檔已正確創建:如果(??)
  2. 我如何檢查新的DOMDocument已經與HTML正確填充?
  3. ...如果創建了新的DOMXPath對象?

希望我很清楚。預先感謝您的回覆。乾杯。馬克

我的PHP:

<?php 
$target_url = "http://www.somesite.com"; 
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)'; 

// make the cURL request to $target_url 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
curl_setopt($ch, CURLOPT_URL,$target_url); 
curl_setopt($ch, CURLOPT_FAILONERROR, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
$html= curl_exec($ch); 

if (!$html) { 
    echo "<br />cURL error number:" .curl_errno($ch); 
    echo "<br />cURL error:" . curl_error($ch); 
    exit; 
} 

// parse the html into a DOMDocument 
$dom = new DOMDocument(); 
@$dom->loadHTML($html); 

// grab all the on the page 
$xpath = new DOMXPath($dom); 
$hrefs = $xpath->query('somepath'); 

for ($i = 0; $i < $hrefs->length; $i++) { 
    $href = $hrefs->item($i); 
    $url = $href->getAttribute('href'); 
    echo "<br />Link: $url"; 
} 

?> 
+0

+1對於不使用reg-ex「解析」HTML。爲了檢測錯誤,請檢查['DOMDocument :: loadHTML()'](http://www.php.net/manual/en/domdocument.loadhtml.php)的相應返回值,並可能刪除抑制運算符' @'。 – 2012-03-12 12:24:18

+0

你好Linus。感謝您的幫助。你能幫我一下語法嗎?應該是:if(DOMDocument :: loadHTML($ html){} else {})? – Marc 2012-03-12 12:32:18

+0

你也可以通過探測HTTP響應代碼來擴展你的「did-curl-execute」檢查(這是通過['curl_getinfo()']完成的(http://php.net/manual/en/function.curl-getinfo .php)並使用'CURLINFO_HTTP_CODE')成功執行'curl_exec()'後。 – 2012-03-12 13:11:19

回答

0

問題解決了。錯誤來自螢火蟲誰錯誤的路徑。非常感謝MrCode對他的支持......

2

使用try/catch來檢查文檔對象的創建,然後檢查loadHTML的返回值(),以確定是否HTML加載到文檔中。您也可以在XPath對象上使用try/catch。

try 
{ 
    $dom = new DOMDocument(); 

    $loaded = $dom->loadHTML($html); 

    if($loaded) 
    { 
     // loaded OK 
    } 
    else 
    { 
     // could not load HTML 
    } 
} 
catch(Exception $e) 
{ 
    // document could not be created, see $e->getMessage() 
} 
+0

MrCode。感謝您的幫助。我使用你的建議,但看起來,對於我的代碼不工作的網站,DOM正確加載。你有什麼想法,暗示我應該看看有什麼線索爲什麼它不在某些網站上工作? – Marc 2012-03-12 12:53:22

+0

在將HTML加載到DOMDocument之前打印出HTML,檢查HTML看起來是否正確,並且它是您正在尋找的正確內容的頁面。如果服務器檢測到它是bot /腳本,您可能會被重定向或顯示錯誤頁面。不同的網站會有不同的HTML結構,因此您需要相應地更改您的查詢,除非您正在尋找像'title'這樣非常通用的東西。 – MrCode 2012-03-12 13:21:42

+0

我在寫這篇文章之前檢查過。如果我回顯$ html它顯示正確...當你說網站有不同的HTML結構,我有什麼需要尋找? – Marc 2012-03-12 13:30:32