универсальный парсер

Тема в разделе "Тех. вопросы", создана пользователем Zood, 1 дек 2009.

  1. Zood

    Zood Создатель

    Регистр.:
    18 июн 2008
    Сообщения:
    35
    Симпатии:
    0
    пробую для себя написать универсальный парсер сайтов.
    Который парсит согласно регулярному выражению пачку юрлов и сохраняем результат в файл...
    Возник трабел с распознанием utf-8, победить кракозябры не могу даже с iconv :confused:
    вообщем хелп ми :bc:
    PHP:
    <?
    ///////////// * CONFING *///////////////
    $log="";
    $pass="";
    $dir="";
    $fname="site-parser.csv";
    $ftp="ftp://$log:$pass@ftp.site.host.ru/$dir/$fname";
    $fcontent='';
    ?>
    <html>
    <body>
    <form action="" method="POST">
    <textarea cols="70" rows="15" name="url"></textarea>
    <br />
    <br />
    <input type="text" name="reg" size="50">
    <br />
    <br />
    <input type="submit" value="отправить">
    </form>
    </body>
    </html>
    <?
    if($_POST[url]){
    $treg=trim($_POST[reg]);
    $reg="#$treg#i";
    echo'<br>'.$reg.'<br>';
    $ar_url=explode("\r\n",$_POST[url]);
    //print_r($ar_url);
    foreach($ar_url as $line => $key){
    $f=file_get_contents($key);
    if(!strpos("#charset=utf-8#i",$f)){
    preg_match_all($reg,$f,$match_ar);
    $res_ar[]=array($key,$match_ar);
    }
    else{
    preg_match_all($reg,iconv("UTF-8", "windows-1251",$f),$match_ar);
    $res_ar[]=array($key,$match_ar);
    }
    }
    }
    //print_r($res_ar);
    /*if ($handle=fopen($ftp,"w")) {
             echo "Не могу открыть файл ($fname)";
             exit;}*/
    //echo'<br />====================<br />';
    foreach($res_ar as $line => $key){
    foreach($key as $line2 => $key2){
    if(is_array($key2))
    {
    foreach($key2[0] as $line3 => $key3){
    //echo$key3.'<br />';
    $fcontent.=($line+1)."\t".$res_url.trim($key3)."\t".$key2[1][$line3]."\r\n";
    }
    }
    else
    {
    $res_url=$key2."\t";
    }
    }
    }
        echo'<textarea cols="90" rows="20">'.$fcontent."</textarea><br />";     
        echo'<textarea cols="90" rows="20">';
        print_r($res_ar);
        echo'</textarea><br />';     
    /*
    if (fwrite($handle,$fcontent)=== FALSE) {
            echo "Не могу произвести запись в файл ($fname)";
            exit;}    
        */
    ?>
     
  2. satih

    satih

    Регистр.:
    19 сен 2008
    Сообщения:
    429
    Симпатии:
    710
    Много кода, извини, неосилил. Начал с твоего, время позднее, доделал уже как сам умею, сори, просто разбиратся в чужом коде, сам знаешь, иногда проще с нуля написать :)

    Насчет кодировок, сделал таким макаром: решил работать с utf-8, если скачиваю страницу windows-1251, переделываю с iconv в utf-8.

    В результате печатает все урлы, где нашлась искомая комбинация. Ну, в принципе код довольно простой, если что, продолжим тут.

    PHP:
    <?php
    header
    ('Content-Type: text/html; charset=UTF-8');

    if (isset(
    $_POST['urls'])) {
        
    $needle trim($_POST['needle']);
        
    $ar_url explode("\r\n"$_POST['urls']);
        
    $ar_url array_unique($ar_url);
        
    $res_ar = array();
        foreach (
    $ar_url as $url) {
            
    $url trim($url);
            
    $html file_get_contents($url);
            if (
    preg_match('%charset=windows-1251%i'$html))
                
    $html iconv("Windows-1251""UTF-8"$html);
            if (
    preg_match('%'.$needle.'%i'$html))
                
    $res_ar[] = $url;
        }

    foreach (
    $res_ar as $url)
        echo 
    $url.'<br />';
    }
    ?>

    <form action="" method="POST">
        <textarea cols="70" rows="15" name="urls"><?=$urls?></textarea><br /><br />
        <input type="text" name="needle" size="50" value="<?=$needle?>"/><br /><br />
        <input type="submit" value="Отправить" />
    </form>
     
  3. solarscape

    solarscape Постоялец

    Регистр.:
    19 июл 2009
    Сообщения:
    109
    Симпатии:
    8
    Скрипт проверяет кодировку в переменной $data и если там юникод, то меняет на 1251.
    PHP:
    if (preg_match('//u'$data)) {  
        
    $data=iconv("UTF-8""windows-1251"$data);
    }
    PS
    Сам писал такой парсер. Спарсил себе 2 каталога статей и один новостной сайт, теперь не знаю куда все это девать :D (Шутка).
     
  4. Zood

    Zood Создатель

    Регистр.:
    18 июн 2008
    Сообщения:
    35
    Симпатии:
    0
    нашел решение это задачи след образом
    скачиваем сайт с помощью offline explorer (или teleport)
    а потом парсим из скаченых файлов нужные нам данные с помощью проги textpipe