Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Вниз

Парсинг HTML в перл   Найти похожие ветки 

 
Kerk ©   (2005-12-29 18:49) [0]

Есть задача распарсить HTML-страничку с целью выделения из нее контента.
РегЭкпы конечно рулят, но должно же быть что-то стандартное для таких целей?


 
Джо ©   (2005-12-29 18:51) [1]


> целью?

<оффтоп>
Похоже, что клавишу "W" уже поставил на место? ;)
</оффтоп>


 
Kerk ©   (2005-12-29 18:52) [2]

Джо ©   (29.12.05 18:51) [1]
Похоже, что клавишу "W" уже поставил на место? ;)


Дык сказал же, что поставил, но нажимается хреново :)


 
umbra ©   (2005-12-29 18:59) [3]

HTML::Parse

По-моему, устанавливается вместе с ActiveState Perl


 
Piter ©   (2005-12-29 19:45) [4]

Kerk ©   (29.12.05 18:49)

сначала прочитал "Пирсинг HTML..." - нифига себе...


 
Piter ©   (2005-12-29 19:46) [5]

Kerk ©   (29.12.05 18:49)
но должно же быть что-то стандартное для таких целей?


RegExp"ы придуманы для распарсивания строк.
У тебя задача как раз распарсить.

Имхо, это и есть стандартное для твоей задачи.


 
Kerk ©   (2005-12-29 21:12) [6]

Да. Тут регэкспы похоже больше подходят

В документе есть последовательность таких блоков:

<font class=tdtext>(var1)
<script>if(blacklist.indexOf(","+25287+",")>=0){document.write("<a href="#" onclick="m_816109.style.visibility=\"visible\"; return false;">...</a><div id=m_816109 style="visibility: hidden;">");blacklist_counter++;}</script>

<a href="/gb.sema?a=user&id=var2"><img src="/images/foto.gif" border=0> var3</a> var4<br>

var5 </font>
       <script>if(blacklist.indexOf(","+25287+",")>=0)document.write("</div>")</script>
<hr width="90%" color="Pink" noshade>


Т.е. в блоке 5 переменных, которые мне необходимо выделить. Можно как-то выделить все 5 за один проход или надо проходит по документу 5 раз?


 
Gero ©   (2005-12-29 21:30) [7]


> Можно как-то выделить все 5 за один проход

Можно.


 
Kerk ©   (2005-12-29 21:32) [8]

Ценю твое остроумие. Ну и?


 
Gero ©   (2005-12-29 21:35) [9]


> Kerk ©   (29.12.05 21:32)

Хотел показать тебе, как ты выглядишь со стороны.

> All
Сорри за оффтоп.


 
Piter ©   (2005-12-29 21:35) [10]

Kerk ©   (29.12.05 21:32) [8]
Ну и?


ну так читай про RegExp"ы. Инфы в интернете полно.
Как там на Perl"е - хрен знает, но обязано быть.


 
Piter ©   (2005-12-29 21:36) [11]

Gero ©   (29.12.05 21:35) [9]
Хотел показать тебе, как ты выглядишь со стороны


кстати, удачно показал.


 
Kerk ©   (2005-12-29 21:39) [12]

Gero ©   (29.12.05 21:35) [9]
Piter ©   (29.12.05 21:36) [11]

Опять мою ветку решили загадить?


 
tesseract ©   (2005-12-29 21:42) [13]

На Delphi-jedi кажись мелькнула PCRE для Delphi :-)


 
Kerk ©   (2005-12-29 21:43) [14]

tesseract ©   (29.12.05 21:42) [13]
На Delphi-jedi кажись мелькнула PCRE для Delphi :-)


Вещь потенциально полезная, но мне именно на перле нужно :)


 
Piter ©   (2005-12-29 21:44) [15]

Удалено модератором


 
Kerk ©   (2005-12-29 21:45) [16]

Удалено модератором


 
Piter ©   (2005-12-29 21:47) [17]

Если поможет, то вот кстати из моего PHP:

var re = new RegExp("^magnet:\\?xt=urn:tree:tiger:[A-Z0-9]+&xl=([0-9]+)&dn=(\\S+)$");
 var arr = re.exec(theSelection);
 size = RegExp.$1;
 name = RegExp.$2;


жирным помечены те места, которые будут занесены в  переменные.

Первое - это число (размер), второе - имя файла.


 
Piter ©   (2005-12-29 21:48) [18]

Удалено модератором


 
Kerk ©   (2005-12-30 00:04) [19]

Kerk ©   (29.12.05 21:12) [6]

По синтаксису перла никто не подскажет?
Вопрос не в том, как написать регэксп. Вопрос в выделении нескольких подстрок.


 
Gero ©   (2005-12-30 00:16) [20]


> [19] Kerk ©   (30.12.05 00:04)

По-моему, того, кто хотел помочь, ты прогнал из ветки :)


 
TUser ©   (2005-12-30 07:21) [21]


> По синтаксису перла никто не подскажет?
> Вопрос не в том, как написать регэксп. Вопрос в выделении
> нескольких подстрок.

Ну напише рег. А скобками выделяй место для переменной. Потом они окажутся в $1, $2, etc.


 
palva ©   (2005-12-30 10:35) [22]

> в блоке 5 переменных, которые мне необходимо выделить
Непонятно, что значит выделить. Если просто получить значения совпадений, то тогда можно так:

$s = "*****var1***************var2******var3*var4****var5";
@a = $s =~ /var\d/g;
print "@a\n"; # var1 var2 var3 var4 var5

Но ты ведь потребуешь еще определить места, где совпало. Места тоже можно определить, но обычно на перле алгоритм строится так, чтобы места были не нужны. Места удобны для мышления программиста, рассматривающего строку как массив. А у перла мышление другое. Поэтому для определения мест регэксп не предназначен. Алгоритм строят, чтобы сразу обрабатывать совпадения. Вот например как можно разбить строку на части. Нечетные части (с нечетными индексами) будут совпадениями, а четные - текстами между совпадений:

$s = "ddddvar1gggvar2jjjjjvar3fvar4wvar5";
@a = ();
while($s =~ /var\d/) {
 push(@a, $`);
 push(@a, $&);
 $s = $"; }
push(@a, $s);
print "@a\n"; # dddd var1 ggg var2 jjjjj var3 f var4 w var5

Самая лучшая книга по перлу лежит на сайте Piter"а в электронном виде
http://www.piter.com/library/978580460198/
Только там требуется бесплатная регистрация.
По регулярным выражениям у него на сайте тоже есть очень подробная книга
http://www.piter.com/library/978531800056
Но это уж слишком подробно, я даже половины не осилил.


 
Piter ©   (2005-12-30 10:49) [23]

palva ©   (30.12.05 10:35) [22]
Самая лучшая книга по перлу лежит на сайте Piter"а


:)

palva ©   (30.12.05 10:35) [22]
Только там требуется бесплатная регистрация


ох, да Керка я без проблем зарегю даже платно :)


 
umbra ©   (2005-12-30 11:14) [24]

#!/usr/bin/perl -w
my $text = q|font class=tdtext>(var1)
<script>if(blacklist.indexOf(","+25287+",")>=0){document.write("<a href="#" onclick="m_816109.style.visibility=\"visible\"; return false;">...</a><div id=m_816109 style="visibility: hidden;">");blacklist_counter++;}</script>

<a href="/gb.sema?a=user&id=var2"><img src="/images/foto.gif" border=0> var3</a> var4<br>

var5 </font>
      <script>if(blacklist.indexOf(","+25287+",")>=0)document.write("</div>")</script>
<hr width="90%" color="Pink" noshade>
|;
my @matches;

@matches = $text =~ /(var\d)/gi;
foreach (@matches) {
   print $_."\n";
}


 
Kerk ©   (2005-12-30 12:41) [25]

Спасибо, принцип ясен. :)

palva ©   (30.12.05 10:35) [22]
Но ты ведь потребуешь еще определить места, где совпало.


Нет, не потребую. На месте varX находятся нужные мне данные. Вот их и необходимо получить. :)


 
umbra ©   (2005-12-30 12:54) [26]

если скажешь точнее, что за данные, то, может можно будет регэксп составить получше


 
Kerk ©   (2005-12-30 13:01) [27]

вот типа такого

   <font class=tdtext>(816260)
   <script>if(blacklist.indexOf(","+25892+",")>=0){document.write("<a href="#" onclick="m_816260.style.visibility=\"visible\"; return false;">...</a><div id=m_816260 style="visibility: hidden;">");blacklist_counter++;}</script>

   <a href="/gb.sema?a=user&id=25892"><img src="/images/foto.gif" border=0> NAME-NICK</a> 30.12.2005 12:28:57<br>
   Доброго всем Нового года!
<br>Желаю, чтобы в наступающем году число действительно праздничных дней радикально отличалось от числа &#34;праздничных-календарных&#34;, и математически стремилось к тремстам шестидесяти пяти!
<br>Не фистех)
</font>
   <script>if(blacklist.indexOf(","+25892+",")>=0)document.write("</div>")</script>
   <hr width="90%" color="Pink" noshade>


 
Kerk ©   (2005-12-30 13:03) [28]

Где полужирный курсив в оригинале была еще пара тегов <.i> , <./i> но форум их прибил :)


 
Piter ©   (2005-12-30 13:16) [29]

Вообще RegExp"ы очень мощная штука. Думаю, ты просто не осознал еще их эффект.
Их возможности покрывают большинство задач по распарсиванию строчки. Единственное ограничение - скорость работы - так как это средство универсальное, то и ресурсы требует соответственно :(

Если нужно обрабатывать огромные массивы данных - то зачастую можно придумать способ побыстрее в контексте своей задачи...


 
umbra ©   (2005-12-30 13:18) [30]

т.е. var1 - число
var2 - число
var3 - тескт
var4 - дата
var5 - многстрочный текст

правильно?


 
Kerk ©   (2005-12-30 13:19) [31]

umbra ©   (30.12.05 13:18) [30]

Да.


 
umbra ©   (2005-12-30 13:27) [32]

тэги везде расположены одинаково?


 
Kerk ©   (2005-12-30 13:30) [33]

umbra ©   (30.12.05 13:27) [32]
тэги везде расположены одинаково?


Те теги, которые не входят в var5, расположены всегда одинаково.


 
umbra ©   (2005-12-30 14:45) [34]

это норамально работает?

#!/usr/bin/perl -w

my $text = q|<    <font class=tdtext>(816260)
  <script>if(blacklist.indexOf(","+25892+",")>=0){document.write("<a href="#" onclick="m_816260.style.visibility=\"visible\"; return false;">...</a><div id=m_816260 style="visibility: hidden;">");blacklist_counter++;}</script>

  <a href="/gb.sema?a=user&id=25892"><img src="/images/foto.gif" border=0> NAME-NICK</a> 30.12.2005 12:28:57<br>
  Доброго всем Нового года!
<br>Желаю, чтобы в наступающем году число действительно праздничных дней радикально отличалось от числа "праздничных-календарных", и математически стремилось к тремстам шестидесяти пяти!
<br>Не фистех)</font>
  <script>if(blacklist.indexOf(","+25892+",")>=0)document.write("</div>")</script>
  <hr width="90%" color="Pink" noshade>|;
my @matches;
my $replStr = "(|)|id=|"|> |</|<br>|font";

@matches = $text =~ /(\(\d*\))|(id=\d*")|(> \w*-\w*<\/)|( \d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2})|(<br>.*<\/font)/gis;
foreach (@matches) {
   s/$replStr//sg;
   print $_."\n";
}



 
Kerk ©   (2005-12-30 16:43) [35]

umbra ©   (30.12.05 14:45) [34]
\w*-\w*<


NAME-NICK - это одно слово :)
Там может быть и просто Kerk
Код сейчас попробую :)


 
umbra ©   (2005-12-30 17:05) [36]


> NAME-NICK - это одно слово :)

тогда в (> \w*-\w*<\/) надо убрать тире


 
Alexander Panov ©   (2005-12-30 21:37) [37]

Здесь продолжим.

Kerk ©   (30.12.05 21:33) [98]
Так ты расскажи расскажи. Расскажи как хороший модератор в приступе неПМС забанил злобного Керка, а тот потом оказался разбанен.. Магия..


Ну дык для того, чтобы рассказать, почему хороший модератор забанил плохого керка, нужно рассказать, что такое ПМС?


 
Kerk ©   (2005-12-30 21:39) [38]

Alexander Panov ©   (30.12.05 21:37) [37]
Здесь продолжим.


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


 
Alexander Panov ©   (2005-12-30 21:40) [39]

Kerk ©   (30.12.05 21:39) [38]
Не будем мы здесь продолжать. Хватит в моих ветках помойку устраивать. Хочешь поговорить - создай свою и рассказывай все, что хочешь. Рассказывать тебе нечего, как я вижу.


Именно в твоих ветках. Почему нет? Они же твои?


 
Alexander Panov ©   (2005-12-30 21:44) [40]

Ладно. Умные товарищи попросили не мараться. Завязал.



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.047 c
14-1135923791
ANB
2005-12-30 09:23
2006.01.22
Поздравляю себя с Днем Рождения (30 декабря)


2-1136324641
Aleks
2006-01-04 00:44
2006.01.22
Управление другим приложением


6-1128941707
Dimich1978
2005-10-10 14:55
2006.01.22
Не проходит PING на несколько адресов(IP)


2-1136097574
_Sergey_
2006-01-01 09:39
2006.01.22
MatchesMask для файлов разных расширений


2-1135921105
Alex7
2005-12-30 08:38
2006.01.22
Обращение к БД при активизации формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский