用curl刮PHP-如何调试

用curl刮PHP-如何调试,php,curl,screen-scraping,Php,Curl,Screen Scraping,几个小时前我才知道什么是刮痧和卷曲,从那以后我就开始玩这个了。然而,我现在面临着一些奇怪的事情。下面的代码适用于某些站点,而不适用于其他站点(当然,我修改了url和xpath…)。请注意,在测试curl_exec是否正确执行时,没有出现任何错误。因此,问题一定来自于某个地方。我的问题如下: 如何检查新文档是否已正确创建:if(?) 如何检查新的DOMDocument是否已正确填充html …是否已创建新的DOMXPath对象 希望我是清楚的。提前感谢您的回复。干杯马克 我的php: <?p

几个小时前我才知道什么是刮痧和卷曲,从那以后我就开始玩这个了。然而,我现在面临着一些奇怪的事情。下面的代码适用于某些站点,而不适用于其他站点(当然,我修改了url和xpath…)。请注意,在测试curl_exec是否正确执行时,没有出现任何错误。因此,问题一定来自于某个地方。我的问题如下:

  • 如何检查新文档是否已正确创建:if(?)
  • 如何检查新的DOMDocument是否已正确填充html
  • …是否已创建新的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";
    }
    
    ?>
    

    使用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()
    }
    

    问题解决了。错误来自firebug,他给出了错误的路径。非常感谢MrCode的支持…

    +1没有使用reg-ex“解析”HTML。为了检测错误,请检查相应的返回值,并可能删除抑制运算符
    @
    。你好,Linus。谢谢你的帮助。你能帮我解释一下语法吗。应该是:if(DOMDocument::loadHTML($html){}else{})?您还可以在成功的
    curl\u exec()
    之后,通过探测HTTP响应代码(通过并使用
    CURLINFO\u HTTP\u code
    )来扩展“did curl execute”检查返回代码200,表示OK。所以问题是,还有什么地方。这开始让我发疯了…@LinusKleen-我在执行curl_后回显html源代码,然后检查它,发现每一行之间都有一个小“段落图标”(请参阅我在主要帖子中所做的编辑),你认为这可能是原因吗?您好,MrCode。谢谢你的帮助。我使用了您的建议,但似乎对于我的代码不起作用的站点,DOM加载正确。你有什么想法吗,提示我应该在哪里寻找线索,为什么它在某些网站上不起作用?在加载到DOMDocument之前打印出HTML,检查HTML外观是否正确,以及它是否是你正在寻找的页面,并且有正确的内容。如果服务器检测到是bot/脚本,您可能会被重定向或显示错误页面。不同的网站会有不同的HTML结构,因此你需要相应地修改你的查询,除非你想找一些非常通用的东西,比如
    标题
    。在写这篇文章之前,我检查了一下。如果我回显$html,它将正确显示。。。当你说站点有不同的html结构时,我需要寻找什么呢?我在curl_执行后回显html源代码,然后检查它,似乎在每行之间都有一个小的“段落图标”。(参见我在主要帖子中的编辑)你认为这可能是原因吗?你想从HTML中提取什么样的数据?