А как вы пишите парсеры?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Chrome~, 15 Sep 2009.

?
  1. Функции pos, delete, copy...

    10 vote(s)
    45.5%
  2. Компонент TRegExp

    6 vote(s)
    27.3%
  3. Компонент Андрея Сорокина - TRegExpr

    2 vote(s)
    9.1%
  4. Другой вариант (напишите какой)

    4 vote(s)
    18.2%
  1. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Привет! Интересуюсь темой насчет написания различных парсеров на Delphi. Хочу немного поднять опыт, поэтому провожу данный опрос. Какие функции используете вы при написании парсеров? Лично я все время использовал функции pos, delete, copy для получения необходимых мне данных. Сейчас немного задумался об эффективности и быстродействии данного метода; решил переходить на парсинг с помощью регулярных выражений.

    Меня интересует, с помощью каких функций парсите вы? Считаете ли свой метод эффективным и быстродействующим? Пожалуйста, напишите, почему используете тот метод а не иной. Заранее благодарю всех, кто ответит.
     
    #1 Chrome~, 15 Sep 2009
    Last edited: 15 Sep 2009
  2. drim

    drim Member

    Joined:
    27 Aug 2009
    Messages:
    347
    Likes Received:
    33
    Reputations:
    4
    Делфи не использую со времён университета.
    ИМХО самое лучшее, что есть для обработки текста - perl с его регулярными выражениями, поддерживающимися на уровне самого языка.
     
  3. Gray_Wolf

    Gray_Wolf Active Member

    Joined:
    7 Mar 2009
    Messages:
    377
    Likes Received:
    135
    Reputations:
    10
    Эх, писал когдато парсер на VB, вот где была жесть :)
    А так, для простых вещей подойдёт PHP или Перл, для всего остального существует СИ.
     
  4. drim

    drim Member

    Joined:
    27 Aug 2009
    Messages:
    347
    Likes Received:
    33
    Reputations:
    4
    Сильно. Только вы пробовали когда-нибудь написать на Си программу для герации сложных, многоуровневых конфигов, элементы которых она должна брать с других конфигов и различных сетевых устройств, а также читать свой конфиг и знать что и кого "спрашивать"? А знаети ли вы что perl - вовсе не для "простых вещей", и вообще расшифровывается аббревиатура perl как "Практический язык для извлечения текстов и генерации отчетов (Рractical Extraction and Report Language)". Что-то в этом названии есть, вы не находите? )
     
    #4 drim, 16 Sep 2009
    Last edited: 16 Sep 2009
  5. Gray_Wolf

    Gray_Wolf Active Member

    Joined:
    7 Mar 2009
    Messages:
    377
    Likes Received:
    135
    Reputations:
    10
    Что-то в этом конечно есть, но вот когда нужно парсить парочку многогиговых БД(часть из которых на Оракле, часть на М$ и часть на мускуле) то преимущество точно не на стороне перла :)
    Перл хорош по части работы с текстом(м таким то названием :) ), но парсинг это не только обработка текста. Когда приходится использовать пару сотен потоков приходися задумыватся ещё и о инет канале(при чём не только на своей стороне, но и как этим парсером не повесить пару сайтов)
     
  6. drim

    drim Member

    Joined:
    27 Aug 2009
    Messages:
    347
    Likes Received:
    33
    Reputations:
    4
    1. При чём здесь интернет-канал? Если речь о множественных запросах к удалённому серверу, то никакой язык программирования не "спасёт" - данные должны быть переданы в необходимом объёме, прежде чем их начнёт обрабатывать скрипт/программа.
    2. Что именно вы хотите парсить в базах данных? Бинарные файлы самой базы MS/My SQL'ей или партиции Oracle? Или дамп БД?
    это и есть обработка ТЕКСТА
    _http://ru.wikipedia.org/wiki/Парсинг
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    PERL наше всио, просто, удобно. но это если парсить текст аля html xml, ну можно извратится и парсить и бинарные данные. А так уже практически в каждом языке программирования есть свои регулярные выражения. А если и нету то легко найти библеотеку например PCRE

    В основном парсеры я писал для веб, IRC ботов ну и делал сплоиты для некотоых сайтиков и писал я их на PERL т.к он очень подходит для подобных задач
     
    _________________________
  8. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    ну и херню же вы несете... Пишу на дельфи, но нет бля, парсить буду на перле, извращаться и скрещивать их. Сильно, Мдоооооо.

    для чего по вашему придумывались регулярные выражения?
     
  9. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    W!z@rD, а кто сказал что мы пишем на делфи? мы и пишем на perl-е :) так что не надо вот тут...
     
    _________________________
  10. Tigger

    Tigger Elder - Старейшина

    Joined:
    27 Aug 2007
    Messages:
    936
    Likes Received:
    527
    Reputations:
    204
    А блять при чем тут перл вообще? Вроде как тема только про Дельфи...
     
  11. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Но, если честно, писать парсеры, боты и т. д. на Delphi и других языках, - вовсе не бредовая идея. Если умеешь, конечно. Меня интересует, какие функции вы чаще всего используете для этой работы?
     
  12. drim

    drim Member

    Joined:
    27 Aug 2009
    Messages:
    347
    Likes Received:
    33
    Reputations:
    4
    В разных языках разные функции. Вы про какой спрашиваете? )
     
  13. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 Chrome~, вот такие функции использую я

    PERL
    Code:
    while($s=<$socket>)
    		{
    		$olds=$next;
    		
    		$all=0;
    		if($s=~/\<td align=\"left\" valign=\"top\" class=\"decorBodyCell\"\>/){$on=1;next;}
    		if($s=~/\<\/td\>/){$on=0;next;}
    		if($s=~/\<a href=\"\.\.\/\"\>(.*)\<\/a\>\&nbsp\;\&nbsp\;\<a href=\"(.*)\">Вперед/){$all=1;$next=$2;next;}
    		if($s=~/\<\/p\>\<\/center\>/){next;}
    		if($s=~/\<p\>(<big>){3}\<strong\>(.*)\<\/strong\>(\<\/big\>){3}\<\/p\>/){$name_stat=$2;next;}
    		if($s=~/\<p\>\<big\>\<strong\>(.*)\<\/strong\>\<\/big\>\<\/p\>/){$autor_stat=$1;next;}
    		if($s=~/\<p\>\<strong\>(.*)\<\/strong\><\/p\>/){next;}
    		if($s=~/\<p\>\<img/){next;}
    		if($s=~/\<p class=\"textBody\">\<br\>/){next;}
    		if($s=~/\<hr/){next;}
    		if($s=~/\s\s\s\<\/p\>/){next;}                       
    
    		if($s=~/\<p\>\((.*)\)\<\/p\>/)
    			{
    			$mail_autor=$1; 
    			if(!$mail_autor=~/[a-z_0-9-]@([a-z_0-9-]+\.)/){$mail_autor='';} 
    			next;
    			}
    		
    			
    			
    		#if($olds eq $next){last;}		
    		if($on==1){$statya.=$s;}
    		
    		}
    	$statya.="|||"; # obozn page
    	}
    
    JS
    Code:
    r = str.match(/(?:operate|operatewall)\s*\x28\s*\d+\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*[\x22\x27](\w+)[\x22\x27]/i);
    
    С
    Code:
    if((re=pcre_compile ((char *) pattern, PCRE_CASELESS|PCRE_MULTILINE, &error, &erroffset, NULL))==NULL){
    			 printf("Error: %s\nSymbol N%i\nPattern:%s\n",error,erroffset,pattern);
    		getchar();
    			 exit(1);
    			 
          }
    	  else
    	  {
    		  if((pairs=pcre_exec(re,NULL,str,4,0,PCRE_NOTEMPTY,vector,vecsize))<0){ printf("Error! num: %i\n",pairs);}  ....
    
    PHP
    Code:
    $id=preg_replace("/\D/","",$_POST['id']);
    
    тупая тема...
     
    _________________________
    1 person likes this.
  14. ange007

    ange007 Member

    Joined:
    26 Aug 2009
    Messages:
    28
    Likes Received:
    21
    Reputations:
    0
    Вот модуль с процедурами для облегчения парсинга страниц:
    Скачать.
     
    6 people like this.