通过curl方法获取url数据,从而在符号中产生意外结果

时间:2012-04-12 05:49:14

标签: php curl

我有些时候通过curl方法获取url数据的问题特别是网站数据是其他语言如阿拉伯语等 我的卷曲功能是

function file_get_contents_curl($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $data = curl_exec($ch);
    $info = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

    //checking mime types
    if(strstr($info,'text/html')) {
        curl_close($ch);
        return $data;
    } else {
        return false;
    }
}

我如何获取数据

$html =  file_get_contents_curl($checkurl);
    $grid ='';
    if($html)
    {
        $doc = new DOMDocument();
        @$doc->loadHTML($html);
        $nodes = $doc->getElementsByTagName('title');
        @$title = $nodes->item(0)->nodeValue;
        @$metas = $doc->getElementsByTagName('meta');
        for ($i = 0; $i < $metas->length; $i++)
        {
            $meta = $metas->item($i);
            if($meta->getAttribute('name') == 'description')
                $description = $meta->getAttribute('content');
        }

我从一些阿拉伯网站上正确地获取所有数据 http://www.emaratalyoum.com/multimedia/videos/2012-04-08-1.474873 当我给你这个youtube url http://www.youtube.com/watch?v=Eyxljw31TtU&feature=g-logo&context=G2c4f841FOAAAAAAAFAA
它显示符号.. 我必须做什么设置来显示完全相同的标题描述。

3 个答案:

答案 0 :(得分:6)

简介

获取阿拉伯语可能非常棘手,但它们是确保

所需的一些基本步骤
  • 您的文档必须输出UTF-8
  • 您的DOMDocument必须以UTF-8 fromat
  • 读取

问题

获取Youtube信息时,它已经以“UTF-8”格式提供了信息,并且检索过程添加了添加UTF-8编码....不确定为什么会出现这种情况,但简单的utf8_decode会修复问题

实施例

header('Content-Type: text/html; charset=UTF-8');
echo displayMeta("http://www.emaratalyoum.com/multimedia/videos/2012-04-08-1.474873");
echo displayMeta("http://www.youtube.com/watch?v=Eyxljw31TtU&feature=g-logo&context=G2c4f841FOAAAAAAAFAA"); 

输出

emaratalyoum.com

التقطت عدسات الكاميرا حارس مرمى ريال مدريد إيكر كاسياس في موقف محرج قبل لحظات من بداية مباراة النادي الملكي مع أبويل القبرصي في ذهاب دور الثمانية لدوري أبطال 

youtube.com

أوروبا.ففي النفق المؤدي إلى الملعب، قام كاسياس بوضع إصبعه في أنفه، وبعدها قام بمسح يده في وجه أحدبنات سعوديات: أريد "شايب يدللني ولا شاب يعللني"

使用的功能

displayMeta

function displayMeta($checkurl) {
    $html = file_get_contents_curl($checkurl);
    $grid = '';
    if ($html) {
        $doc = new DOMDocument("1.0","UTF-8");
        @$doc->loadHTML($html);
        $nodes = $doc->getElementsByTagName('title');
        $title = $nodes->item(0)->nodeValue;
        $metas = $doc->getElementsByTagName('meta');
        for($i = 0; $i < $metas->length; $i ++) {
            $meta = $metas->item($i);
            if ($meta->getAttribute('name') == 'description') {
                $description = $meta->getAttribute('content');
                if (stripos(parse_url($checkurl, PHP_URL_HOST), "youtube") !== false)
                    return utf8_decode($description);
                else {
                    return $description;
                }
            }
        }
    }
}

*的 file_get_contents_curl *

function file_get_contents_curl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $data = curl_exec($ch);
    $info = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

    // checking mime types
    if (strstr($info, 'text/html')) {
        curl_close($ch);
        return $data;
    } else {
        return false;
    }
}

答案 1 :(得分:1)

我相信这会有效... utf8_decode()你的属性..

function file_get_contents_curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$data = curl_exec($ch);
$info = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

//checking mime types
if(strstr($info,'text/html')) {
    curl_close($ch);
    return $data;
} else {
    return false;
}
}

$html =  file_get_contents_curl($checkurl);
$grid ='';
if($html)
{
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    $nodes = $doc->getElementsByTagName('title');
    @$title = $nodes->item(0)->nodeValue;
    @$metas = $doc->getElementsByTagName('meta');
    for ($i = 0; $i < $metas->length; $i++)
    {
        $meta = $metas->item($i);
        if($meta->getAttribute('name') == 'description')
            $description = utf8_decode($meta->getAttribute('content'));
    }

答案 2 :(得分:1)

这里发生的是您丢弃了Content-Type函数中返回的cURL找到的file_get_contents_curl()标头; DOMDocument需要该信息来理解页面上使用的字符集。

有点丑陋的黑客,但最通用的是,在返回的页面前面加上一个<meta>标记,其中包含来自响应标题的返回字符集:

if (strstr($info, 'text/html')) {
    curl_close($ch);
    return '<meta http-equiv="Content-Type" content="' . $info . '" />' . $data;
}

DOMDocument将接受错放的元标记并自动执行相应的转换。