Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > парсинг сложных таблиц


Автор: burakov 7.6.2012, 23:26
Здравствуйте, 
поставили задачу распарсить в отдельные поля 
расписание 
http://www.fitnes.ru/content/ru/schedule.html?cl=8299

сложность заключается в том, что 
в таблице, где содержится расписание понаобъединяли столбцы

после простейшего распарсивания
получилось

Код

<td class="w100">11:00</td>
<td class="dark sched_cmn_0">&nbsp;</td>
<td class="light sched_cmn_0">&nbsp;</td>
<td class="dark sched_cmn_0">&nbsp;</td>
<td class="light sched_cmn_3016">Yoga 1.5ч</td>
<td class="dark sched_cmn_0">&nbsp;</td>
<td class="light sched_cmn_4110">Step 1 </td>
<td class="dark td_last sched_cmn_0" rowspan="2">&nbsp;</td>


<td class="w100">12:00</td>
<td class="dark sched_cmn_4111">Interval </td>
<td class="light sched_cmn_4109">Здоровая спина </td>
<td class="dark sched_cmn_4110">Step 1 </td>
<td class="light sched_cmn_4117">Latina 12:30</td>
<td class="dark sched_cmn_4105">Tae-bo </td>
<td class="light sched_cmn_4101">Super strong </td>


<td class="w100">13:00</td>
<td class="dark sched_cmn_4555">abs+stretch </td>
<td class="light sched_cmn_4099">Fitball </td>
<td class="dark sched_cmn_4101">Super strong </td>
<td class="light sched_cmn_3018">Dance mix 13:30</td>
<td class="dark sched_cmn_4113">Lower body </td>
<td class="light sched_cmn_7973"> Самбо $</td>
<td class="dark td_last sched_cmn_3010">Бокс </td>


<td class="w100">14:00</td>
<td class="dark sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="light sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="dark sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="light sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="dark sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="light sched_cmn_0" rowspan="8">&nbsp;</td>
<td class="dark td_last sched_cmn_4109">Здоровая спина </td>


<td class="w100">15:00</td>
<td class="dark td_last sched_cmn_4113">Lower body </td>


<td class="w100">16:00</td>
<td class="dark td_last sched_cmn_3016">Yoga </td>


<td class="w100">17:00</td>
<td class="dark td_last sched_cmn_3019">BellyDance </td>


<td class="w100">18:00</td>
<td class="dark sched_cmn_4102">Basic class </td>
<td class="light sched_cmn_4117">Latina </td>
<td class="dark sched_cmn_4101">Super strong </td>
<td class="light sched_cmn_3017">Stretch </td>
<td class="dark sched_cmn_4099">Fitball </td>
<td class="dark td_last sched_cmn_7973"> Kettle Bell $</td>


<td class="w100">19:00</td>
<td class="dark sched_cmn_4114">Upper body </td>
<td class="light sched_cmn_7973"> DanceStretch /Step 1</td>
<td class="dark sched_cmn_3014">Pilates </td>
<td class="light sched_cmn_4107">Strip dance </td>
<td class="dark sched_cmn_4110">Step 1 </td>
<td class="dark td_last sched_cmn_0" rowspan="3">&nbsp;</td>


<td class="w100">20:00</td>
<td class="dark sched_cmn_4111">Interval /Самбо</td>
<td class="light sched_cmn_4113">Lower body Жен. бокс</td>
<td class="dark sched_cmn_4099">Fitball BellyDance</td>
<td class="light sched_cmn_4111">Interval /Самбо</td>
<td class="dark sched_cmn_4101">Super strong </td>


<td class="w100">21:00</td>
<td class="dark sched_cmn_7287">Capoeira Abs+Stretch</td>
<td class="light sched_cmn_3016">Yoga 1.5ч /Бокс</td>
<td class="dark sched_cmn_3017">Stretch </td>
<td class="light sched_cmn_3014">Pilates /Capoeira</td>
<td class="dark sched_cmn_4109">Здоровая спина Бокс</td>



из чего видно, что построчно такую таблицу не возьмешь
поскольку непонятно (там где меньшее количество столбцов) какой ячейке таблицы принадлежит контент.


понимаю что хочу ЧУДА, но для моей логики  данный парсинг весьма сложен оказался
может есть какой то модуль?
который бы преобразовывал данную таблицу 
в таблицу состоящую из одиночных ячеек (без rowspan="").

или может кто уже делал и поделится кусочком кода.?

спасибо.




Автор: EcSYZ 8.6.2012, 00:21
Как на счёт варианта - превратить rowspan в несколько записей ?
Что-то вроде:
Код

my @new_data;
foreach my $str(@html_data){
    #my $str
    if($str =~ /rowspan=\"(\d+)\"/){
        $str = q{<td class="dark sched_cmn_4111"></td>}x$1;
    }
    push @new_data, $str;
}

Автор: burakov 8.6.2012, 07:58
спасибо.

об этом решении я подумал конечно, но это было бы легко, если бы в каждой строке было свое объединение столбцов.
ниже кусочек, где видно, что в верхней строке есть объединение, а внизу оставлен просто 1 столбец.
то есть нужно как то еще анализировать предыдущее состояние...

кроме того кусочек показывает как криво выполненно само объединение (хотя отображается "глазами" все верно). (я имею ввиду, что столбцов в таблице всего 8, а роуспанов хрен поймешь на каждой ячейке понатыкано.) -- вообщем криво до безобразия.
прямо руки опускаются. smile.

Код

<td class="w100">14:00</td>
<td class="dark sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="light sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="dark sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="light sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="dark sched_cmn_0" rowspan="4">&nbsp;</td>
<td class="light sched_cmn_0" rowspan="8">&nbsp;</td>
<td class="dark td_last sched_cmn_4109">Здоровая спина </td>

<td class="w100">15:00</td>
<td class="dark td_last sched_cmn_4113">Lower body </td>

Автор: White_Eagle 8.6.2012, 13:37
Как я вижу из предоставленного html -  значения есть только там где  td class="ляляляляля_4109" - последние 4 цифры. А там где в конце "0" - их нет. 
Начинать с
Код

if ($_=~/<td class="w100">(.?)</td>/)
            {
                my $time=$1;

 
а дальше проверять "0" в конце класса - пропускать или 4 цифры - записывать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)