Функции парсинга веб страниц.

Тема в разделе ".:: Готовые решения", создана пользователем dumber, 18 июл 2008.

Статус темы:
Закрыта.
  1. dumber

    dumber

    Регистр.:
    23 апр 2007
    Сообщения:
    272
    Симпатии:
    123
    Парсинг данных со страниц вещь врхиважная, товарисчи :)
    Посему выкладываю ряд функция для нахождения ряда значений. Предлагаю в этом топике выписывать и свои наблюдения по сабжу, дабы составить всеобъемлющий класс парснга данных, чтоб любой парсер за 5 минут делать ;)

    PHP:
    <?php 

    // получение doctype документа
    function get_doctype($file){ 
        
    $h1tags preg_match('/<!DOCTYPE (\w.*)dtd">/is',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[0]); 
        
    array_push($res,count($patterns[0])); 
        return 
    $res


    // получение заголовка страницы
    function get_doc_title($file){ 
        
    $h1tags preg_match('/<title> ?.* <\/title>/isx',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[0]); 
        
    array_push($res,count($patterns[0])); 
        return 
    $res


    // получение ключевых слов
    function get_keywords($file){ 
        
    $h1tags preg_match('/(<meta name="keywords" content="(.*)" \/>)/i',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение rel ссылок из заголовков сайта 
    function get_link_rel($file){ 
        
    $h1tags preg_match_all('/(rel=)(".*") href=(".*")/im',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res

    // получение внешних css
    function get_external_css($file){ 
        
    $h1tags preg_match_all('/(href=")(\w.*\.css)"/i',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех h1 тэгов 
    function get_h1($file){ 
        
    $h1tags preg_match_all("/(<h1.*>)(\w.*)(<\/h1>)/isxmU",$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех h2 тэгов  
        
    function get_h2($file){ 
        
    $h1tags preg_match_all("/(<h2.*>)(\w.*)(<\/h2>)/isxmU",$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех h3 tags 
    function get_h3($file){ 
        
    $h1tags preg_match_all("/(<h3.*>)(\w.*)(<\/h3>)/ismU",$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех h4 tags 
    function get_h4($file){ 
        
    $h1tags preg_match_all("/(<h4.*>)(\w.*)(<\/h4>)/ismU",$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех h5 tags 
    function get_h5($file){ 
        
    $h1tags preg_match_all("/(<h5.*>)(\w.*)(<\/h5>)/ismU",$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех h6 tags 
    function get_h6($file){ 
        
    $h1tags preg_match_all("/(<h6.*>)(\w.*)(<\/h6>)/ismU",$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение содержания всех p тэгов 
    function get_p($file){ 
        
    $h1tags preg_match_all("/(<p.*>)(\w.*)(<\/p>)/ismU",$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех названий ссылок 
    function get_a_content($file){ 
        
    $h1count preg_match_all("/(<a.*>)(\w.*)(<.*>)/ismU",$file,$patterns); 
        return 
    $patterns[2]; 


    // получение всех урликов 
    function get_a_href($file){ 
        
    $h1count preg_match_all('/(href=")(.*?)(")/i',$file,$patterns); 
        return 
    $patterns[2]; 


    // подсчет кол-ва href 
    function get_a_href_count($file){ 
        
    $h1count preg_match_all('/<(a.*) href=\"(.*?)\"(.*)<\/a>/',$file,$patterns); 
        return 
    count($patterns[0]); 


    // получение всех доп тегов внутри тега ссылки
    function get_a_additionaltags($file){ 
        
    $h1count preg_match_all('/<(a.*) href="(.*?)"(.*)>(.*)(<\/a>)/',$file,$patterns); 
        return 
    $patterns[3]; 


    // получение всех  span ов 
    function get_span($file){ 
        
    $h1count preg_match_all('/(<span .*>)(.*)(<\/span>)/',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех сркриптов - Яваскрипт в чатсности
    function get_script($file){ 
        
    $h1count preg_match_all('/(<script.*>)(.*)(<\/script>)/imxsU',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех ul
    function get_ul($file){ 
        
    $h1count preg_match_all('/(<ul \w*>)(.*)(<\/ul>)/ismxU',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех li
    function get_li($file){ 
        
    $h1count preg_match_all('/(<li \w*>)(.*)(<\/li>)/ismxU',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех комментов на странице 
    function get_comments($file){ 
        
    $h1count preg_match_all('/(<!--).(.*)(-->)/isU',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех ID используемых на странице 
    function get_ids($file){ 
        
    $h1count preg_match_all('/(id="(\w*)")/is',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res

    // получение всех классов документа 
    function get_classes($file){ 
        
    $h1count preg_match_all('/(class="(\w*)")/is',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех мета тег данных
    function get_meta_content($file){ 
        
    $h1count preg_match_all('/(<meta)(.*="(.*)").\/>/ix',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех стилей (указанных построчно)
    function get_styles($file){ 
        
    $h1count preg_match_all('/(style=")(.*?)(")/is',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех титлов тегов
    function get_tag_titles($file){ 
        
    $h1count preg_match_all('/(title=)"(.*)"(.*)/',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех альтернативных названий картинок
    function get_image_alt($file){ 
        
    $h1count preg_match_all('/(alt=.)([a-zA-Z0-9\s]{1,})/',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[2]); 
        
    array_push($res,count($patterns[2])); 
        return 
    $res


    // получение всех изображений
    function get_images($file){ 
        
    $h1count preg_match_all('/(<img)\s (src="([a-zA-Z0-9\.;:\/\?&=_|\r|\n]{1,})")/isxmU',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[3]); 
        
    array_push($res,count($patterns[3])); 
        return 
    $res


    // получение всех имейлов с тегом mailto:
    function get_mailto($file){ 
        
    $h1count preg_match_all('/(<a\shref=")(mailto:)([a-zA-Z@0-9\.]{1,})"/ims',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[3]); 
        
    array_push($res,count($patterns[3])); 
        return 
    $res


    // получение всех имейлов
    function get_emails($file){ 
        
    $h1count preg_match_all('/[a-zA-Z0-9_-]{1,}@[a-zA-Z0-9-_]{1,}\.[a-zA-Z]{1,4}/',$file,$patterns); 
        
    $res = array(); 
        
    array_push($res,$patterns[0]); 
        
    array_push($res,count($patterns[0])); 
        return 
    $res


    // подсчет используемых ключевых слов
    function countkeyword($word,$file){ 
        
    $x preg_match_all("/(.*)($word)(.*)/",$file,$patterns); 
        return 
    count($patterns); 


    // получение всех внутренных ссылок сайта
    function get_internal_links($array){ 
        
    $result = array(); 
        
    $count count($array); 
            for(
    $i=0;$i<$count;$i++){ 
                if(!empty(
    $array[$i])){        
                    if(
    strpos($array[$i],"www",0) === false){ 
                        if(
    strpos($array[$i],"http",0) === false){                    
                            
    array_push($result,$array[$i]); 
                        } 
                    } 
                } 
            } 
        return 
    $result


    // получение всех внешних ссылок сайта
    function get_external_links($array){ 
        
    $result = array(); 
        
    $count count($array); 
            for(
    $i=0;$i<$count;$i++){ 
                if(!empty(
    $array[$i])){        
                    if(
    strpos($array[$i],"www",0) !== false){ 
                        if(
    strpos($array[$i],"http",0) !== false){                    
                            
    array_push($result,$array[$i]); 
                        } 
                    } 
                } 
            } 
        return 
    $result


    // получение главного урла сайта
    function get_main_url($url){ 
        
    $parts parse_url($url); 
        
    $url $parts["scheme"] ."://".$parts["host"]; 
        return 
    $url


    // получение всех доменного имени без ввв и хвоста 
    function get_domain_name_only($url){ 
        
    $match preg_match("/(.*:\/\/)\w{0,}(.*)\.(.*)/",$url,$patterns); 
        
    $patterns[2] = str_replace(".","",$patterns[2]); 
        return 
    $patterns[2]; 

    ?>
     
    dandandan, Oleg_Ci, Den_4k и 45 другим нравится это.
  2. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    ТС скажи а фейс у этого скрипта есть какойнить...??
    а то я обозвал pars.php запускаю пусто....
    или это просто класы и ничего более..???
     
  3. judgefog

    judgefog

    Регистр.:
    12 авг 2006
    Сообщения:
    487
    Симпатии:
    335
    как же ты увидишь что-нить кроме пусто
    если там нет никакого вывода (echo, print)

    код надо инклудить в свой скрипт, а там вызывать одну из функций

    и только попробуй мне в PHP Pro запостить вопрос как вызываются функции. Есть ветка для новичков.
     
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    В продолжение темы:

    Выдирание всех форм из документа.

    PHP:

    function getforms($document)  {    
        
    $elements = array();

        
    preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements);
            
        
    $match implode("\r\n",$elements[0]);
        return 
    $match;
    }

     
    stargazerrrrr, sergey_479, SPATLET и 4 другим нравится это.
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Нашел более "мудрый" преобразователь html в простой текст. Из описания:
    * - корректно обрабатываются вхождения типа "a < b > c"
    * - корректно обрабатывается "грязный" html, когда в значениях атрибутов тагов могут встречаться символы < >
    * - корректно обрабатывается разбитый html
    * - вырезаются комментарии, скрипты, стили, PHP, Perl, ASP код, MS Word таги, CDATA
    * - автоматически форматируется текст, если он содержит html код
    * - защита от подделок типа: "<<fake>script>alert('hi')</</fake>script>"

    последнее оставил, а вот мануал сюда постить не надо
     

    Вложения:

    solarscape и Liver нравится это.
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    В первом коде полно ошибок и неточночтей, не стоит его использовать. На вскидку - /(<meta name="keywords" content="(.*)" \/>)/i захватит все теги до конца строки после <meta, не говоря уже о задании атрибута в одинарных кавычках, без кавычек, дополнительных пробелов между атрибутами, html синтаксисе без />
     
  7. Neow15ard

    Neow15ard

    Регистр.:
    27 ноя 2008
    Сообщения:
    422
    Симпатии:
    188
    я остановился на проекте
    http://sourceforge.net/projects/simplehtmldom/
    вот к примеру кусок рабочего парсера
    PHP:
        $ret['Rating'] = $html->find('div[class="voters"] span'0)->plaintext;
        
    $ret['ImageLink'] = $html->find('div[class="maindata"] div img'0)->outertext;
        
    $ret['Ocenka'] = $html->find('table[class="form pros"]'0)->innertext;

    Первая строка выдерет только обычнный текст из тегов div class=voters
    Втроя заберет ссылку на картинку из вложенного div в divе с классом maindata.
    а третья выдерет все что внутри таблицы с классом form pros (html)
    и т.д.
    Очень подвижный парсер, примеров там штук 8 есть. Не халява - мануал почитать придется.но он того стоит.
    часа 4 читал доку 5 часов писал...
    но теперь и парсер и граббер и 20к страниц + графика у мя в кармане.
     
    rkinfo, Tau и DOLARiON нравится это.
  8. DOLARiON

    DOLARiON

    Регистр.:
    4 сен 2006
    Сообщения:
    191
    Симпатии:
    48
    попробовал.. .прикольная штука, но..... на русском тексте почему-то затыкается :(
    не сталкивался с данной траблой?

    ---
    разобрался... все банально - скармливаем в utf8 и ноу проблем :)
     
  9. GEEPERS

    GEEPERS

    Регистр.:
    26 янв 2008
    Сообщения:
    162
    Симпатии:
    25
    HTML теги записываем в массив:
    PHP:
    // получение html тегов в массив
    function html_to_array$url$element null )
    {
        if( !( 
    $data file_get_contents$url ) ) )
            return 
    false;
        
        
    preg_match_all'~<img.*?>(</img>)?~si'$data$page['img'] );
        
    preg_match_all'~<div.*?>.*?[^<]</div>~'$data$page['div'] );
        
    preg_match_all'~<style.*?>.*?[^<]</style>~'$data$page['Inline_Css'] );
        
    preg_match_all'~<link.*?>~'$data$page['Linked_Css'] );
        
    preg_match_all'~<meta.*?[^>]>~'$data$page['Meta'] );
        
    preg_match_all'~<a.*?[^>].*[^<]</a>~'$data$page['Link'] );
        return !
    is_null$element ) ? $page$element ] : $page ;
    }
     
  10. lorien

    lorien Постоялец

    Регистр.:
    2 авг 2006
    Сообщения:
    84
    Симпатии:
    11
    Странные решения предложены топикстартером.

    /(rel=)(".*") href=(".*")/im - меняем в HTML местами href и rel и ничо не работает, или используем одинарные кавычки и тоже ничо не работает.

    или вот:
    /<title> ?.* <\/title>/ - смысла в " ?" вообще никакого. Лучше б этот вопросик после ".*" поставили.

    Или вот:
    /(<script.*> - было бы лучше записать /(<script[^>]*>. Оно бы дошло только до первого знака ">", а так будет фигачить по всему HTML до конца. Ну, типа, медленно это :)

    Начинание хорошее, но нужно *много* доработок, иначе вы такого напарсите...


    > HTML теги записываем в массив:
    > preg_match_all( '~<a.*?[^>].*[^<]</a>~', $data, $page['Link'] );
    Перемудрили. Такой регексп всосёт весь HTML в себя - от первой до последней ссылки :)
     
    Думаю нравится это.
Статус темы:
Закрыта.