Форум: "Потрепаться";
Текущий архив: 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>Желаю, чтобы в наступающем году число действительно праздничных дней радикально отличалось от числа "праздничных-календарных", и математически стремилось к тремстам шестидесяти пяти!
<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.56 MB
Время: 0.039 c