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

Статус
В этой теме нельзя размещать новые ответы.

dumber

Постоялец
Регистрация
23 Апр 2007
Сообщения
272
Реакции
124
Парсинг данных со страниц вещь врхиважная, товарисчи :)
Посему выкладываю ряд функция для нахождения ряда значений. Предлагаю в этом топике выписывать и свои наблюдения по сабжу, дабы составить всеобъемлющий класс парснга данных, чтоб любой парсер за 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]; 
} 
?>
 

o_nix

Хранитель порядка
Регистрация
7 Ноя 2007
Сообщения
1.070
Реакции
1.063
ТС скажи а фейс у этого скрипта есть какойнить...??
а то я обозвал pars.php запускаю пусто....
или это просто класы и ничего более..???
 

judgefog

Мой дом здесь!
Регистрация
12 Авг 2006
Сообщения
486
Реакции
340
как же ты увидишь что-нить кроме пусто
если там нет никакого вывода (echo, print)

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

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

venetu

Мой дом здесь!
Регистрация
28 Мар 2007
Сообщения
745
Реакции
273
В продолжение темы:

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

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;
}
 

venetu

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

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

Вложения

  • strip_tags_smart.txt
    8,1 KB · Просмотры: 199

RolCom

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

Neow15ard

Постоялец
Регистрация
26 Ноя 2008
Сообщения
418
Реакции
190
я остановился на проекте

вот к примеру кусок рабочего парсера
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к страниц + графика у мя в кармане.
 

DOLARiON

Гуру форума
Регистрация
4 Сен 2006
Сообщения
191
Реакции
65
я остановился на проекте
*** скрытое содержание ***

попробовал.. .прикольная штука, но..... на русском тексте почему-то затыкается :(
не сталкивался с данной траблой?

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

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 ;
}
 

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 в себя - от первой до последней ссылки :)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху