Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: получения контента с сайта
 
 автор: starpom   (21.08.2010 в 12:57)   письмо автору
 
 

Получаю контент с помощью file_get_contents? а там такая радость:

div class="ad-region">Подольский р-н</div>
<h2>Студио, ст.м. «Контрактовая площадь»</h2>
Что посоветуете для нормального отображения кирилицы?

  Ответить  
 
 автор: lElectroHardl   (21.08.2010 в 13:05)   письмо автору
 
   для: starpom   (21.08.2010 в 12:57)
 

По названию темы - используйте грабберы.
Как перевести - вот

  Ответить  
 
 автор: psychomc   (21.08.2010 в 13:48)   письмо автору
 
   для: lElectroHardl   (21.08.2010 в 13:05)
 

как перевести по ссылке - там вообще-то функция javascript

  Ответить  
 
 автор: Gubichev   (21.08.2010 в 13:10)   письмо автору
 
   для: starpom   (21.08.2010 в 12:57)
 

iconv("UTF-8","CP1251","<div class=\"ad-region\">Подольский СЂ-РЅ</div>
<h2>Студио, СЃС‚.Рј. В«РљРѕРЅС‚рактовая РїР»РѕС‰Р°РґСЊВ»</h2>");

  Ответить  
 
 автор: starpom   (21.08.2010 в 13:40)   письмо автору
 
   для: Gubichev   (21.08.2010 в 13:10)
 

<?php 
  
  $content 
' <div class="ad-desc">Квартиры В» РђСЂРµРЅРґР° РґРѕР»РіРѕСЃСЂРѕС‡РЅРѕ В» РљРёРµРІ В» РџРѕРґРѕР»СЊСЃРєРёР№ СЂ-РЅ</p>';

      
iconv"UTF-8""CP1251" $content);// Производит преобразование кодировки символов строки $content из "UTF-8" в "CP1251" 

     
preg_match_all("/(?<=\"ad-desc\">).*(?=<\/p>)/"$content$text);      
      
      echo 
"<pre>";
        
print_r ($text);
      echo 
"<pre>";
 
?>



такой код выводит в опере:


Array
(
[0] => Array
(
[0] => Квартиры » Аренда долгосрочно » Киев » Подольский р-н
)
)

Странно, Производит преобразование кодировки символов строки $content из "UTF-8" в "CP1251" , а отображаеться строка нормально только если в опере выбрать кодировку UTF-8.
А если автоматически, то то что в массиве. По-моему преобразование не срабатывае вообще, закоментировал строку - все тоже. ???

  Ответить  
 
 автор: Gubichev   (21.08.2010 в 13:48)   письмо автору
 
   для: starpom   (21.08.2010 в 13:40)
 

Ну изменили вы кодировку. А присвоить перекодированную строку переменной content не надо?
<?php 

$content 
' <div class="ad-desc">Квартиры В» РђСЂРµРЅРґР° РґРѕР»РіРѕСЃСЂРѕС‡РЅРѕ В» РљРёРµРІ В» РџРѕРґРѕР»СЊСЃРєРёР№ СЂ-РЅ</p>';

     
$content=iconv"UTF-8""CP1251" $content);// Производит преобразование кодировки символов строки $content из "UTF-8" в "CP1251" 

     
preg_match_all("/(?<=\"ad-desc\">).*(?=<\/p>)/"$content$text);      
      
      echo 
"<pre>";
        
print_r ($text);
      echo 
"<pre>";
 
?> 

  Ответить  
 
 автор: starpom   (21.08.2010 в 13:59)   письмо автору
 
   для: Gubichev   (21.08.2010 в 13:48)
 

да, верно так работает, спасибо.

  Ответить  
 
 автор: psychomc   (21.08.2010 в 13:49)   письмо автору
 
   для: starpom   (21.08.2010 в 13:40)
 

посмотрите что за кодировка на сайте, из которого вы этот контент дергаете

  Ответить  
 
 автор: starpom   (21.08.2010 в 14:02)   письмо автору
 
   для: psychomc   (21.08.2010 в 13:49)
 

там похоже UTF_8, так что угадали, а что я бы мог зная url средствами php узнавать кодировку сайта и ,в зависимости от нее, преобразовывать контент в нужную мне кодировку?

  Ответить  
 
 автор: Gubichev   (21.08.2010 в 14:08)   письмо автору
 
   для: starpom   (21.08.2010 в 14:02)
 

Могли бы

  Ответить  
 
 автор: nikita2206   (21.08.2010 в 14:34)   письмо автору
 
   для: starpom   (21.08.2010 в 14:02)
 

Поймете как пользоваться? Если че - писал я, для себя.

<?php

function arrayChoose($array$key){
    return 
$array[$key];
}

function 
postHelper($array){
    
$str = array();
    foreach(
$array as $k => $v$str[] = $k.'='.urlencode($v);
    return 
implode('&'$str);
}

function 
Sockets($url$port 80){
    if(!
function_exists('curl_init')){
        if(!(
$init fsockopen(arrayChoose(parse_url($url), 'host'), $port))) return FALSE;
        return new 
Socket_helper($init$url);
    }else{
        if(!(
$init curl_init($url))) return FALSE;
        return new 
CURL_helper($init);
    }
}

class 
CURL_helper {

    private 
$resource;

    public 
$getHeaders     FALSE,
           
$inputEncoding  'windows-1251',
           
$outputEncoding 'windows-1251',
           
$autoEncoding   TRUE,
           
$userAgent      'Mozilla/5.0',
           
$method         'GET',
           
$postFields     '';

    public function 
__construct($init){
        
$this->resource $init;
    }

    public function 
__destruct(){
        
curl_close($this->resource);
    }

    public function 
getResponse(){
        
        
curl_setopt($this->resourceCURLOPT_HEADER,         $this->getHeaders || $this->autoEncoding);
        
curl_setopt($this->resourceCURLOPT_RETURNTRANSFERTRUE);
        
curl_setopt($this->resourceCURLOPT_USERAGENT,      $this->userAgent);
        
curl_setopt($this->resourceCURLOPT_CUSTOMREQUEST,  $this->method);
        
        if(
strtoupper($this->method) == 'POST'){
            
curl_setopt($this->resourceCURLOPT_POST,       TRUE);
            
curl_setopt($this->resourceCURLOPT_POSTFIELDS$this->postFields);
        }

        
$response curl_exec($this->resource);
        if(!
$this->getHeaders && !$this->autoEncoding) return $response;

        
$response explode("\n"$response);
        
$num 0;
        foreach(
$response as $num => $string) if($string == "\r" || $string == '') break;

        
$headers implode("\n"array_slice($response0$num));
        
$body    implode("\n"array_slice($response$num));
        unset(
$response);

        if(
$this->autoEncoding){
            
preg_match('|charset[ ]?\=[ ]?(.+)|'$headers$charset);
            if(
$charset$this->inputEncoding trim($charset[1]);
            if(
strtolower($this->inputEncoding) != strtolower($this->outputEncoding)) $body iconv($this->inputEncoding$this->outputEncoding$body);
        }

        return 
$this->getHeaders ? array($headers$body) : $body;

    }

    public function 
inFile($fileName$chunkSize 0x1000){

        
curl_setopt($this->resourceCURLOPT_HEADER,    $this->getHeaders);
        
curl_setopt($this->resourceCURLOPT_USERAGENT$this->userAgent);

        if(!(
$fp fopen($fileName'w+'))) return FALSE;

        
curl_setopt($this->resource,  CURLOPT_FILE,       $fp);
        @
curl_setopt($this->resourceCURLOPT_BUFFERSIZE$chunkSize);

        if(!(
$isOk curl_exec($this->resource))) return FALSE;
        if(!
$this->getHeaders){
            
fclose($fp);
            return 
$isOk;
        }

        
$header '';
        
$mark   FALSE;
        
$fpW    fopen($fileName.'.copy''w');

        
fseek($fp0);
        while(!
feof($fp)){
            if(
$markfwrite($fpWfread($fp0x40000));
            else{
                
$str fgets($fp);
                if(
trim($str) == ''$mark TRUE;
                else 
$header .= $str;
            }
        }
        
fclose($fp);
        
fclose($fpW);
        
unlink($fileName);
        
rename($fileName.'.copy'$fileName);

        return 
$header;

    }

}

class 
Socket_helper {

    private 
$resource,
            
$url,
            
$headersSended FALSE;
    
    public 
$getHeaders     FALSE,
           
$inputEncoding  'windows-1251',
           
$outputEncoding 'windows-1251',
           
$autoEncoding   TRUE,
           
$responsePiece  '',
           
$userAgent      'Mozilla/5.0',
           
$method         'GET',
           
$postFields     '';
    
    public function 
__construct($init$url){
        
$this->resource $init;
        
$this->url      $url;
    }

    public function 
__destruct(){
        
fclose($this->resource);
    }

    public function 
getResponse(){

        
$url parse_url($this->url);

        
$headers  $this->method.' '.(strlen($url['path']) ? $url['path'] : '/').(isset($url['query']) ? '?'.$url['query'] : '').' HTTP/1.1'."\r\n";
        
$headers .= 'Host: '.$url['host']."\r\n";
        
$headers .= 'User-Agent: '.$this->userAgent."\r\n";
        
$headers .= 'Content-Type: application/x-www-form-urlencoded'."\r\n";
        
$headers .= strtoupper($this->method) == 'POST' 'Content-Length: '.strlen($this->postFields)."\r\n" '';
        
$headers .= 'Connection: close'."\r\n";
        
$headers .= "\r\n";
        if(
strtoupper($this->method) == 'POST'$headers .= $this->postFields;

        
fwrite($this->resource$headers);

        
$header '';
        
$body   '';
        
$mark     FALSE;
        while(!
feof($this->resource)){
            if(!
$mark){
                
$str fgets($this->resource);
                if(
trim($str) == ''$mark TRUE;
                else if(
$this->getHeaders || $this->autoEncoding$header .= $str;
            }else 
$body .= fread($this->resource2048);
        }

        if(!
$this->getHeaders && !$this->autoEncoding) return $body;

        if(
$this->autoEncoding){
            
preg_match('|charset[ ]?\=[ ]?(.+)|'$header$charset);
            if(
$charset$this->inputEncoding trim($charset[1]);
            if(
strtolower($this->inputEncoding) != strtolower($this->outputEncoding)) $body iconv($this->inputEncoding$this->outputEncoding$body);
        }

        return 
$this->getHeaders ? array($header$body) : $body;

    }

    public function 
iterate($chunkSize 0x800){

        if(
$this->headersSended){
            if(
feof($this->resource)) return FALSE;
            
$this->responsePiece fread($this->resource$chunkSize);

            return 
TRUE;
        }else{

            
$url parse_url($this->url);

            
$headers  'GET '.(strlen($url['path']) ? $url['path'] : '/').(isset($url['query']) ? '?'.$url['query'] : '').' HTTP/1.1'."\r\n";
            
$headers .= 'Host: '.$url['host']."\r\n";
            
$headers .= "\r\n";

            
fwrite($this->resource$headers);

            
$this->headersSended TRUE;

            if(
$this->getHeaders) return TRUE;

            while(!
feof($this->resource)){
                if(
trim(fgets($this->resource)) == '') return TRUE;
            }

        }

    }

    public function 
inFile($fileName$chunkSize 0x1000){

        
$url parse_url($this->url);

        
$headers  'GET '.(strlen($url['path']) ? $url['path'] : '/').(isset($url['query']) ? '?'.$url['query'] : '').' HTTP/1.1'."\r\n";
        
$headers .= 'Host: '.$url['host']."\r\n";
        
$headers .= 'User-Agent: '.$this->userAgent."\r\n";
        
$headers .= "\r\n";

        
fwrite($this->resource$headers);

        if(!(
$fp fopen($fileName'w'))) return FALSE;

        
$mark FALSE;
        
$header '';
        while(!
feof($this->resource)){
            if(
$markfwrite($fpfread($this->resource$chunkSize));
            else{
                
$str fgets($this->resource);
                if(
trim($str) == ''$mark TRUE;
                else if(
$this->getHeaders$header .= $str;
            }
        }
        
fclose($fp);
        
        return 
$this->getHeaders $header TRUE;

    }

}

  Ответить  
 
 автор: starpom   (21.08.2010 в 14:41)   письмо автору
 
   для: nikita2206   (21.08.2010 в 14:34)
 

наверно крутая штука, буду разбирать, если что спрошу?

  Ответить  
 
 автор: nikita2206   (21.08.2010 в 14:51)   письмо автору
 
   для: starpom   (21.08.2010 в 14:41)
 

<?php
$sock 
Sockets($url);
$page $sock->getResponse();
unset(
$sock);


Вот так можно скачать содержимое в перменную, кодировка определится сама и конвертнится в кодировку, установленную в $sock->outputEncoding (по умолчанию - win-1251).

  Ответить  
 
 автор: sim5   (21.08.2010 в 14:40)   письмо автору
 
   для: starpom   (21.08.2010 в 14:02)
 

Назовите url сайта с которого вы берете контент.

  Ответить  
 
 автор: starpom   (21.08.2010 в 14:42)   письмо автору
 
   для: sim5   (21.08.2010 в 14:40)
 

http://fn.ua/

  Ответить  
 
 автор: sim5   (21.08.2010 в 14:49)   письмо автору
 
   для: starpom   (21.08.2010 в 14:42)
 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

А еще, в заголовках можно посмотреть, но не передает заголовке этот сайт кодировку.

  Ответить  
 
 автор: nikita2206   (21.08.2010 в 14:52)   письмо автору
 
   для: sim5   (21.08.2010 в 14:49)
 

Мне кажется, сайт должен в первую очередь именно в заголовке передавать, а про мету вообще могли бы уже забыть.

  Ответить  
 
 автор: sim5   (21.08.2010 в 15:01)   письмо автору
 
   для: nikita2206   (21.08.2010 в 14:52)
 

Ну кажется, но не всегда это так. Вот таким методом можно получить кодировку, если она передается заголовком:
get_headers(url), и получим Content-Type: text/html .... вот тут кодровка, но не у всех.
Либо прочитать метатеги:
get_meta_tags(url), но опять таки не всегда все заголовки читаются.

  Ответить  
 
 автор: psychomc   (21.08.2010 в 17:47)   письмо автору
 
   для: starpom   (21.08.2010 в 14:02)
 

можно например зайти на сайт и в браузере посмотреть если сложно с помощью php

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования