Модераторы: ginnie, korob2001

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Захат таблиц в HTML, помогите regexp смастерить 
V
    Опции темы
TTT
Дата 10.4.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



Доброго времени суток!

Есть известный код:
Код

$np = qr{
                \(
                (?:
                     (?> [^()]+ )  # нескобки без возврата
                 |
                     (??{ $np })  # группировать с найденными скобками
                )*
                \)
              }x;


Этот регексп находит набор вложенных скобок, как бы глубоко они не были вложены.
А как написать чтобы находил таблицы в html файле?
PM MAIL   Вверх
TTT
Дата 11.4.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



Погорячился наверное, не в том разделе создал тему. Если можно, переместите ее в общий раздел.
PM MAIL   Вверх
TTT
Дата 11.4.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



У меня пока такие результаты. 
Код скрипта:
Код

#!/usr/bin/perl
$body = qq(<table>
    <tr>
        <td><img src="/images/temp.gif" width="15" height="1"></td>
        <td>
            <table>
                <tr>
                    <td><a href="/">SS</a></td>
                    <td>
                        <table>
                            <tr><td><img src="/images/temp.gif" width="1" height="5"></td></tr>
                        </table>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>);

$np = qr{<table>\s*?<tr>\s*?<td>\s*?(?:.+?<\/td>|$np)\s*?<\/tr>\s*?<\/table>}; # самая глубокая таблица

while ($body =~ s/($np)/<X>/si) {
    push @c, $1;
}
map s/\s+//g, @c;
print "\$body:$body\n";
print "\@c:@c\n";


Но выражение $np находит самую клубоко вложенную таблицу. А надо все.

PM MAIL   Вверх
nitr
Дата 11.4.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



Нет, просто поиском можно найти ответы, на форуме уже обсждалась такая тема.
А лучше модули использовать... хотя всё равно более общий ответ сложнее получить ;)


--------------------
PM   Вверх
TTT
Дата 11.4.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



Млин, если в самой глубокой таблице будет строк больше чем одна, 
например, 
Код

<tr>...</tr>
...
<tr>...</tr>

то уже не работает...

Добавлено через 8 минут и 41 секунду
nitr, простым поиском по форуму решение вопроса я найти не смог, (может плохо искал?).
По поводу модулей, ограничение, можно пользовать только стандартные.
Уточняю задачу: необходимо из HTML файла достать все таблицы, начиная с вложенных, (разобрать так сказать), в массив, чтобы потом выборочно по условию собрать обратно.
PM MAIL   Вверх
amg
Дата 11.4.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



А если просто
Код

($c) = $body =~ /(<table>.*<\/table>)/s;
print "$c\n";

Для уточненной задачи это, конечно, не годится. Сорри, не прочитал во-время.

Это сообщение отредактировал(а) amg - 11.4.2007, 11:31
PM MAIL   Вверх
nitr
Дата 11.4.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



Цитата(TTT @  11.4.2007,  11:17 Найти цитируемый пост)
По поводу модулей, ограничение, можно пользовать только стандартные.

с чем это связано? Перл всем хорошо, даже модули можно самому скопировать куда можно smile и указать use lib 'путь';
Тем более эти модули думаю и копилить не надо...


--------------------
PM   Вверх
TTT
Дата 11.4.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



Связано с тем, что задачка по работе, решить вопрос с установкой модуля нереально, (пробовал уже, футболят), а решать надо.
PM MAIL   Вверх
amg
Дата 11.4.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Вот так, вроде, работает
Код

$tag = 'table';
while ($body =~ s|(<$tag>(?:(?!</?$tag>).)*</$tag>)|<X>|s) {
  push @c, $1;
}



Это сообщение отредактировал(а) amg - 11.4.2007, 13:06
PM MAIL   Вверх
TTT
Дата 11.4.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



Спасибо amg, предложенное решение вполне подходит, осталось только разобраться как это работает smile
PM MAIL   Вверх
nitr
Дата 11.4.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



или модули, или, к примеру, конечные автоматы smile


--------------------
PM   Вверх
nitr
Дата 11.4.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



вот что-то недалекое от "автоматов", конечно можно оптимизировать и тем более улучшить код (но! я показываю идею и самую простую её реализацию ;) )
Код

#!perl -w
use strict;

my $body = qq(<table><tr><td><table>
    <tr>
        <td><img src="/images/temp.gif" width="15" height="1"></td>
        <td>
            <table>
                <tr>
                    <td><a href="/">SS</a></td>
                    <td>
                        <table>
                            <tr><td><img src="/images/temp.gif" width="1" height="5"></td></tr>
                        </table>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table></table>);

my $hash;
my $begin;
$body =~ s/(<[^>]*?table[^>]*?>)/"\n$1\n"/sge; # все теги начала и конца таблицы как отдельную  строку
foreach (split /\n/, $body) {
    $begin++ if $_ =~ m{<\s*?table\s*?>};
    # ниже считываем так сказать сами таблицы (для каждой своё)
    if ( $begin ) {
        for (my $i = 1; $i <= $begin; $i++) {
            $hash->{'table'.$i} .= $_;
        }
    }
    $begin-- if $_ =~ m{<\s*?/table\s*?>};
}

# Вывод результата
foreach (reverse sort keys %$hash) {
    print "$_ => \n".$hash->{$_}."\n\n";
}



--------------------
PM   Вверх
nitr
Дата 12.4.2007, 14:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



так вроде немного понятней ;)
Код

#!perl -w
use strict; use warnings;

my $body = qq(<table><tr><td><table>
    <tr>
        <td><img src="/images/temp.gif" width="15" height="1"></td>
        <td>
            <table>
                <tr>
                    <td><a href="/">SS</a></td>
                    <td>
                        <table>
                            <tr><td><img src="/images/temp.gif" width="1" height="5"></td></tr>
                        </table>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table></table>);

my $hash;
my $begin;
my $btoken = qr{<[^</>]*?table[^>]*?>};
my $etoken = qr{<[^<>]*?/table[^>]*?>};

foreach (grep {s/($btoken|$etoken)/"\n$1\n"/sge; 1;} (split /\n/, $body)) {
    $begin++ if $_ =~ /$btoken/;

    if ( $begin ) {
        foreach my $i (1..$begin+1) {
            s/\n//;
            $hash->{'table'.$i} .= $_;
        }
    }

    $begin-- if $_ =~ /$etoken/;
}

# Вывод результата
foreach (reverse sort keys %$hash) {
    print "$_ => \n".$hash->{$_}."\n\n";
}



--------------------
PM   Вверх
TTT
Дата 12.4.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2007

Репутация: нет
Всего: 1



Спасибо, nitr. 
PM MAIL   Вверх
amg
Дата 12.4.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



nitr, очень красивый алгоритм! 
Может, конечно, кондовый программист скажет, что подобные алгоритны - это классика , но я то не программист, и для меня это - открытие.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.