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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите отпарсить HTML 
:(
    Опции темы
6r4yf0x
  Дата 5.4.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Постараюсь объяснить суть проблемы. 
Есть сайт работающий по https. На одной из его страниц выводятся заявки вот в такой таблице:
ПРИМЕР
Код

<table border="1">

                        <thead id="sort_thead">
                            <tr>
                                <td class="header" nowrap>&nbsp№&nbsp</td>
                                <td class="header" nowrap>Идентификатор</td>
                                <td class="header" nowrap>ФИО клиента</td>
                                <td class="header" nowrap>Тип договора</td>
                                <td class="header" nowrap>Телефон</td>

                                <td class="header" nowrap>Адрес заявки</td>
                                <td class="header" nowrap>Примечание к адресу</td>
                                <td class="header" id="date">Дата создания заявки</td>
                                <td class="header" id="date">Дата просрока заявки</td>
                                <td class="header" id="date">Дата последней сессии*</td>
                                <td class="header" nowrap>Комментарий</td>

                            </tr>
                        <tbody id="search_source">
                            <tr id="c2519217" onmouseout="this.style.backgroundColor = ''" onmouseover="this.style.backgroundColor = '#DCDFE4'">
                                <td align="right">1</td>
                                <td align="right">2519217</td>
                                <td align="left"><a href="blabla.bla" title="Показать заявку">Иванов Иван Иванович</a></td>
                                <td align="left">Домашний интернет</td>

                                <td align="left">123456789</td>
                                <td align="left">Барнаул, Медведева, 15, кв. 583</td>
                                <td align="left"></td>
                                <td align="center">05.04.2010 10:35</td>
                                <td align="center">08.04.2010 10:35</td>
                                <td align="center">05.04.2010 10:58</td>
                                <td align="left">Настроить программу Skype. Ждут 06,04,10 с 14 до 20. к/т Сотовый: 123456789;</td>
                            </tr>
                            <tr id="not_found" style="display: none;">
                                <td colspan="10" align="center">Нет строк с данными, содержащими <span id="search_tmpl"></span></td>
                            </tr>
                        </tbody>
                        </table>



В примере таблица с одной заявкой. Заявки то появляются а после их выполнения исчезают. 

Вся идея заключается в том. Чтобы данные по заявкам отправлять в ICQ по входящему запросу. Для этого я нашёл и дописал под себя вот такой вот код:
Код

#!/usr/bin/perl
use IO::Socket::SSL;
$login =  "login";
$pass = "pass";

$socket = new IO::Socket::SSL("blabla.bla:https") || warn "I encountered a problem: ", &IO::Socket::SSL::errstr();
$socket->autoflush;
#Шаг первый. Отправка запроса скрипту и получение ключа.
print $socket join("\015\012" =>
"GET /cgi-bin/ppo/alius/cg_main.login?login%24c=$login&passwd%24c=$pass HTTP/1.1",

"Host: blabla.bla","", "");
while(<$socket>){if(m/ssn=(.*)&/i){$key = $1;}}
#Шаг второй. Отправка запроса с ключом. 
$socket = new IO::Socket::SSL("blabla.bla:https") || warn "I encountered a problem: ", &IO::Socket::SSL::errstr();
$socket->autoflush;
print $socket join("\015\012" =>
"GET /cgi-bin/ppo/alius/cg_main.show_requests?usr=1225&ssn=$key&ptp=4&op=&cty=243&strt=&hnmb=&uhs=&cmp=&mcd= HTTP/1.1",

"Host: blabla.bla","", "");
print <$socket>;

К ICQ потом буду прикручивать. 
Такой думаю не маловажный момент. Сервер сам закрывает соединение. Connection: close.

И тут я столкнулся с проблемой. А как отпарсить заявки? Если бы была одна заявка то было бы всё легко. А там же их может быть и 50 штук.

Помогите пожалуйсто в решении этого вопроса. Сам не могу понять. Это мой второй опыт работы с перлом. Заранее спасибо. Если не написал какую-то важную информацию, скажите - допишу. 
PM MAIL   Вверх
6r4yf0x
  Дата 21.4.2010, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Опытный
**


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

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



Цитата(6r4yf0x @  5.4.2010,  12:13 Найти цитируемый пост)
А как отпарсить заявки?


С помощью регулярного выражения.


--------------------
PM MAIL   Вверх
6r4yf0x
Дата 24.4.2010, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(6r4yf0x @  5.4.2010,  12:13 Найти цитируемый пост)
А как отпарсить заявки?


С помощью регулярного выражения.
[/QUOTE]

А можно как-то ещё их отпарсить? О_о

Прошу прощения за неправильно сформулированный вопрос.
Попробую его задать ещё раз, правильно.

Количество заявок может быть разным. Как отпарсить неизвестное количество заявок?

Я понимаю это следующим образом:
1. Определить начало заявки.
2. Определить конец заявки.
3. Занести данные в переменные.
4. Проверить есть ли дальше начало заявки.
4а. Если есть начало заявки то (пункт2, 3, 4)
4б. Если нет начала заявки то стоп.

Как это реализовать? 

Это сообщение отредактировал(а) 6r4yf0x - 24.4.2010, 00:23
PM MAIL   Вверх
Pfailed
Дата 24.4.2010, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(6r4yf0x @  24.4.2010,  00:23 Найти цитируемый пост)
А можно как-то ещё их отпарсить?


А чем не устраивает предложенный вариант? То что вы расписали делается одним регулярным выражением, в Perl это стандартная практика.
Ну ещё можете посмотреть модуль HTML::Parser и подобные, но думаю этот вариант не проще.



--------------------
PM MAIL   Вверх
6r4yf0x
Дата 24.4.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Pfailed @ 24.4.2010,  03:35)
Цитата(6r4yf0x @  24.4.2010,  00:23 Найти цитируемый пост)
А можно как-то ещё их отпарсить?


А чем не устраивает предложенный вариант? То что вы расписали делается одним регулярным выражением, в Perl это стандартная практика.
Ну ещё можете посмотреть модуль HTML::Parser и подобные, но думаю этот вариант не проще.

Не могли бы вы, таки, написать это регулярное выражение, которое бы наглядно показало ваш предложенный вариант.
PM MAIL   Вверх
Pfailed
Дата 24.4.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(6r4yf0x @  24.4.2010,  15:29 Найти цитируемый пост)
Не могли бы вы, таки, написать это регулярное выражение, которое бы наглядно показало ваш предложенный вариант.

Можно:
Код

use strict;

my $test = '
<table>
    <tr>
        <td>some text</td>
        <td>other text</td>
        <td>some value</td>
    </tr>
</table>

<table>
    <tr>
        <td>some text  1</td>
        <td>other text 1</td>
        <td>some value 1</td>
    </tr>
</table>
';

my @values = $test =~ m!<table>\s*
                              <tr>\s*
                                    <td>([^<]+)</td>\s*
                                    <td>([^<]+)</td>\s*
                                    <td>([^<]+)</td>\s*
                              </tr>
                      !gx or die 'regexp failed';

$" = '; ';
for(my $i=0, my $j=1; $i<@values; $i+=3, $j++)
{
      print "TABLE $j: ", "@values[$i,$i+1,$i+2]", "\n";
}


Для последующего ознакомления читать тут.


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


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

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


 




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


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

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