Encounter - парсинг страницы

Просьбы о написании новых скриптов или поиске уже существующих.

Модератор: Модераторы

Encounter - парсинг страницы

Сообщение sad » 26 сен 2010 08:20

Есть такой проект - Encounter. Нужет скрипт, который будет парсить страницу *.aspx. выдавая на канал результат: название игры, как играют, последовательность, автор, начало игры, приз, взнос.

Пример кода страницы:

<td height="18">Играем:
<span class="white"><b>Командами</b></span><span class="Text4" ID="spanMaxTeamPlayers"> (<span class="gold">ограничение 8 человек</span>)</span>
</td>
</tr>

<tr>
<td height="18">Последовательность прохождения:
<span class="white">Линейная</span>
</td>
</tr>


<tr>
<td height="18">
Авторы игры:
<a ID="lnkAuthor" target="_blank" href="/UserDetails.aspx?uid=72139">strangeman</a>, <a ID="lnkAuthor" target="_blank" href="/UserDetails.aspx?uid=84952">Ultramarin</a>, <a ID="lnkAuthor" target="_blank" href="/UserDetails.aspx?uid=119518">Avangebit</a>
</td>
</tr>

<tr>
<td height="18">Начало игры:
<span class="white">25.09.2010 21:00:00&nbsp;(<a target="_blank" href="/HowTo.aspx?about=UTC" onclick="return i15053347461.ShowDialog();">UTC</a><script type="text/javascript">//<![CDATA[

var i15053347461 = new EnDialogBox({"skin":"DefaultDialogSkin","width":666,"height":300,"title":"Помощь","btnHidden":"hddni15053347461","buttons":["dlgBtnOK"],"ajaxUrl":"/ALoader/Help.aspx?about=UTC"});
//]]></script>&nbsp;+11)</span>
</td>
</tr>
<tr id="ActiveGamesRepeater_ctl00_gameInfo_enContPanel_YourTimeArea">
<td height="18">Начало игры в вашей временной зоне:
<span class="white"><span id="ActiveGamesRepeater_ctl00_gameInfo_enContPanel_lblYourTime"></span>&nbsp;(<a target="_blank" href="/HowTo.aspx?about=UTC" onclick="return i12507472301.ShowDialog();">UTC</a><script type="text/javascript">//<![CDATA[

var i12507472301 = new EnDialogBox({"skin":"DefaultDialogSkin","width":666,"height":300,"title":"Помощь","btnHidden":"hddni12507472301","buttons":["dlgBtnOK"],"ajaxUrl":"/ALoader/Help.aspx?about=UTC"});
//]]></script> <span id="ActiveGamesRepeater_ctl00_gameInfo_enContPanel_lblUTCOffset"></span>)</span>
</td>
</tr>

<tr>
<td height="18">Время окончания:
<span class="white">26.09.2010 20:00:00 (<a target="_blank" href="/HowTo.aspx?about=UTC" onclick="return i15859638701.ShowDialog();">UTC</a><script type="text/javascript">//<![CDATA[

var i15859638701 = new EnDialogBox({"skin":"DefaultDialogSkin","width":666,"height":300,"title":"Помощь","btnHidden":"hddni15859638701","buttons":["dlgBtnOK"],"ajaxUrl":"/ALoader/Help.aspx?about=UTC"});
//]]></script>&nbsp;+11)</span>
</td>
</tr>

<tr>
<td height="18">Подтверждения принимаются до:
<span class="white">25.09.2010 19:00:00 (<a target="_blank" href="/HowTo.aspx?about=UTC" onclick="return i16530071981.ShowDialog();">UTC</a><script type="text/javascript">//<![CDATA[

var i16530071981 = new EnDialogBox({"skin":"DefaultDialogSkin","width":666,"height":300,"title":"Помощь","btnHidden":"hddni16530071981","buttons":["dlgBtnOK"],"ajaxUrl":"/ALoader/Help.aspx?about=UTC"});
//]]></script>&nbsp;+11)</span>
</td>
</tr>


В принципе движка проекта единая, так что должно парсить любую главную страницу.

как выглядит начало, но на работает:

TCL: [ Скачать ] [ Скрыть ]
bind pub - !en pub_encounterstat
bind msg - !en pub_encounterstat

proc pub_encounterstat {nick uhost hand chan args} {
set url "http://komsa.en.cx/Default.aspx"
set id [::egglib::http_init "pub_encounterstat_"]
::egglib::http_get $id $url [list $nick $uhost $chan]
}
proc pub_encounterstat_on_error {id nick uhost chan site} {
     ::egglib::out $nick $chan "\0032Немогу соедениться с http://komsa.en.cx/.. -.-\003"
}

proc pub_encounterstat_on_data {id data nick uhost chan } {
   putlog "1"
foreach line [split $data \n] {
   if {[ regexp -nocase -- {<a\ href=./GameDetails.aspx.*? id=.*? class=.*?>(.*?)</a>} $line garb nextgame] } { set nextgame [string trim $nextgame] }
   if {[ regexp -nocase -- {<td\ height=.*?>Играем.<span\ class=.*?><b>(.*?)</b></span></td> } $line garb gametype]} {
    ::egglib::writedata "scripts/debug.html" [list $nextgame $gametype]
     putlog "2"
     putchan $chan "Предстоящая игры: $nextgame $gametype "
     break

}
}
}
 



Подскажите, помогите довести скрипт до ума.
Нежелание играться - первый признак деградации ;)
Аватара пользователя
sad
 
Сообщения: 28
Зарегистрирован: 15 авг 2010 16:17
Откуда: Комсомольск-на-Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21+suzi

Re: Encounter - парсинг страницы

Сообщение tvrsh » 26 сен 2010 18:05

Настройка цветов, антифлуд.

Пример:
<tvrsh> !en
<@bionic> Предстоящие игры: Схватка (#15) На игре.
<@bionic> Играем: Командами (ограничение 4 человека).
<@bionic> Последовательность прохождения: Штурмовая.
<@bionic> Автор игры: Annual fight.
<@bionic> Начало игры: 01.01.2011 0:00:01 (UTC +10).
<@bionic> Время окончания: 31.12.2011 23:59:59 (UTC +10).
<@bionic> Времени осталось: 96 дней 5 минут 21 секунду.
<@bionic> Подтверждения принимаются до: 31.12.2011 23:59:59 (UTC +10).
<@bionic> Подтвердили участие 0 команд. Приняты к участию 0 команд.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Encounter - парсинг страницы

Сообщение sad » 01 окт 2010 06:51

Огроменное спасибо!
Нежелание играться - первый признак деградации ;)
Аватара пользователя
sad
 
Сообщения: 28
Зарегистрирован: 15 авг 2010 16:17
Откуда: Комсомольск-на-Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21+suzi

Re: Encounter - парсинг страницы

Сообщение sad » 25 окт 2010 15:49

Уважаемый tvrsh
А если (даже не если, а так и произошло), одна из позиций пуста.

TCL: [ Скачать ] [ Скрыть ]
    regexp {<td class="left5p19h yellow_darkgreen19" width="100%">(.*?)</td>} $data "" head
    regexp {Играем:(.*?)</td>} $data "" igraem
    #вот этой позиции нет в Точках вообще
    regexp {Последовательность прохождения:(.*?)</td>} $data "" posled
    regexp {Автор игры:(.*?)</td>} $data "" author
    regexp {Начало игры:(.*?)</td>} $data "" nachalo
    regexp {Время окончания:(.*?)</td>} $data "" okonch
    regexp {Времени осталось:(.*?)</td>} $data "" ostalos
    regexp {Подтверждения принимаются до:(.*?)</td>} $data "" before
    regexp {Подтвердили участие(.*?)команд} $data "" podtv
    regexp {Приняты к участию(.*?)команд} $data "" accept


То есть, получается при отсутствии позиции, нам нужно ее скинуть и не обрабатывать, иначе будет ошибка скрипта и на канал выходит информация только до той позиции которой нет :(

[22:28] <Vesemir> Предстоящие игры: Точки (#116) Инструкция по выживанию.
[22:28] <Vesemir> Играем: Командами (ограничение 7 человек).


Всё, далее бот просто молчит.
Иногда Некоторые позиции скрыты, например количество играющих... Что можно сдесь сделать?
Нежелание играться - первый признак деградации ;)
Аватара пользователя
sad
 
Сообщения: 28
Зарегистрирован: 15 авг 2010 16:17
Откуда: Комсомольск-на-Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21+suzi

Re: Encounter - парсинг страницы

Сообщение tvrsh » 25 окт 2010 22:03

Можно задать всем получаемым данным предварительные значения. Для этого перед строкой
    regexp {<td class="left5p19h yellow_darkgreen19" width="100%">(.*?)</td>} $data "" head
Добавь строки
    set head "Нет данных."; set igraem "Нет данных."; set posled "Нет данных."; set author "Нет данных."
    set nachalo "Нет данных."; set okonch "Нет данных."; set ostalos "Нет данных."; set before "Нет данных."
    set podtv "Нет данных."; set accept "Нет данных."

Те значения, которые будут успешно взяты со странички, перекроют эти предварительные. Ну а те, которые нет, останутся такими.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Encounter - парсинг страницы

Сообщение sad » 26 окт 2010 14:27

В итоге, проблему решил пока, пожертвовав колоризацией текста.

TCL: [ Скачать ] [ Скрыть ]
###
#
#  Название: encounter.tcl
#  Версия: 1.0
#  Автор: tvrsh
#
###
#
# Описание: Скрипт забирает с сайта http://komsa.en.cx/ информацию о предстоящих играх.
#
###
#
# Установка:
#         1. Скопируйте скрипт encounter.tcl в папку scripts вашего бота.
#         2. В файле eggdrop.conf впишите строку source scripts/encounter.tcl
#         3. Сделайте .rehash боту.
#
###
#
# Версион хистори:
#
#              1.0(26.09.2010) Первая паблик версия.
#
###

namespace eval encounter {
# Сбрасываем значения всех переменных.
foreach p [array names encounter *] { catch {unset encounter($p) } }

# Указываем канальный флаг(.chanset #chan +encounter для включения скрипта).
setudef flag encounter

###                            ###
# Меню настроек ниже этой линии: #
# ______________________________ #
###                            ###
        variable encounter
        array set encounter {
        pref {!}
        binds {enkomsa энкомса}
        msg 1
        delay 30
       color1 \00303
       color2 \00303
       color3 \00305
        version "encounter.tcl version 1.0"
        author "tvrsh"
        }

###                                                                  ###
# Ниже этой линии начинается код, не изменяйте его если не знаете TCL: #
# ____________________________________________________________________ #
###                                                                  ###

# Обработка биндов.
foreach bind [split $encounter(binds) " "] {
    bind pub -|- "$encounter(pref)$bind" ::encounter::encounter_pub
    if {$encounter(msg) >= 1} {
        bind msg -|- "$encounter(pref)$bind" ::encounter::encounter_msg
    }
}

# Процедура обработки приватных команд.
proc ::encounter::encounter_msg {nick uhost hand text} {
    variable encounter
    ::encounter::encounter_proc $nick $uhost $hand $nick
}

# Процедура обработки паблик команд.
proc ::encounter::encounter_pub {nick uhost hand chan text} {
    variable encounter

    # Проверяем наличие флага.
    if {![channel get $chan encounter]} {
        return
    }
    ::encounter::encounter_proc $nick $uhost $hand $chan
}

# Процедура обработки запроса.
proc ::encounter::encounter_proc {nick uhost hand chan} {
    variable encounter

    if {[info exists encounter(lasttime,$chan)] && [expr $encounter(lasttime,$chan) + $encounter(delay)] > [clock seconds]} {
        putserv "NOTICE $nick :$encounter(color1)Запрос не чаще одного раза в $encounter(color2)$encounter(delay) $encounter(color1)[lindex {. секунду секунды секунд} [encounter_numgrp $encounter(delay)]]."
        putserv "NOTICE $nick :$encounter(color1)Подождите $encounter(color3)[expr $encounter(delay) - [expr [clock seconds] - $encounter(lasttime,$chan)]] $encounter(color1)[lindex {. секунду секунды секунд} [encounter_numgrp [expr $encounter(delay) - [expr [clock seconds] - $encounter(lasttime,$chan)]]]] до следующего запроса."
        return 0
    }
    set encounter_tok [::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)"]
    set encounter_tok [::http::geturl "http://komsa.en.cx/default.aspx?m=&lang=ru" -binary 1 -timeout 20000]  
    set data [::http::data $encounter_tok]
    ::http::cleanup $encounter_tok
    putlog "\[encounter\] $nick/$chan"

    if {[info exists ::sp_version]} {
        set data [encoding convertfrom utf-8 $data]
    } else {
        set data [encoding convertto cp1251 [encoding convertfrom utf-8 $data]]
    }

    regexp {<span class=\"PageTitle\">Предстоящие\ игры</span>(.*?)<div class=\"divDescr\">} $data "" data
    regexp {<span id="
ComingGamesRepeater_ctl00_gameInfo_enContPanel_gameHeader_lblGameTypeName">(.*?)</span>} $data "" type

    regsub -all -- "
\n" $data "" data
    regsub -all -- "
<span .*?>" $data "" data
    regsub -all -- "
<a .*?>" $data "" data
    regsub -all -- "
<script .*?>.*?</script>" $data "" data
    regsub -all -- "
</span>|</a>" $data "" data
    regsub -all -- "
<b>|</b>" $data "\002" data
    regsub -all -- "
&nbsp;" $data " " data
    regsub -all -- "
<font .*?>" $data "" data
    regsub -all -- "
</font>" $data "" data
    regsub -all -- "
подать заявку на участие" $data "" data

    set head "
Нет данных"
    set igraem "
Нет данных"
    set posled "
Нет данных"
    set probeg "
Нет данных"
    set author "
Нет данных"
    set nachalo "
Нет данных"
    set okonch "
Нет данных"
    set ostalos "
Нет данных"
    set before "
Нет данных"
    set prize "
Нет данных"
    set cost "
Нет данных"
    set podtv "
Нет данных"
    set accept "
Нет данных"
   
    regexp {<td class="
left5p19h yellow_darkgreen19" width="100%">(.*?)</td>} $data "" head
    regexp {Играем:(.*?)</td>} $data "
" igraem
    regexp {Последовательность прохождения:(.*?)</td>} $data "
" posled
    regexp {Минимальный пробег: (.*?)</td>} $data "
" probeg
    regexp {Ав(.*?)</td>} $data "
" author
    regexp {Начало игры:(.*?)</td>} $data "
" nachalo
    regexp {Время окончания:(.*?)</td>} $data "
" okonch
    regexp {Времени осталось:(.*?)</td>} $data "
" ostalos
    regexp {Подтверждения принимаются до:(.*?)</td>} $data "
" before
    regexp {Приз:(.*?)</td>} $data "
" prize
    regexp {Взнос за участие:(.*?)</td>} $data "
" cost
    regexp {Подтвердили участие(.*?)команд} $data "
" podtv
    regexp {Приняты к участию(.*?)команд} $data "
" accept

    putserv "
PRIVMSG $chan :$encounter(color1)Предстоящие игры: $encounter(color3)$type $encounter(color2)[join $head]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Играем: $encounter(color2)[join $igraem]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Последовательность прохождения: $encounter(color2)[join $posled]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Минимальный пробег: $encounter(color2)[join $probeg]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Ав[join $author]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Начало игры: $encounter(color2)[join $nachalo]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Время окончания: $encounter(color2)[join $okonch]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Времени осталось: $encounter(color2)[join $ostalos]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Подтверждения принимаются до: $encounter(color2)[join $before]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Приз: $encounter(color2)[join $prize]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Взнос за участие: $encounter(color2)[join $cost]$encounter(color1).\003"
    putserv "
PRIVMSG $chan :$encounter(color1)Подтвердили участие $encounter(color2)[join $podtv] $encounter(color1)команд. Приняты к участию $encounter(color2)[join $accept] $encounter(color1)команд.\003"
    set encounter(lasttime,$chan) [clock seconds]
    return 0
}

proc encounter_numgrp {number} {
    switch -glob -- "
$number" {
        *11 {return 3}
        *12 {return 3}
        *13 {return 3}
        *14 {return 3}
        *1 {return 1}
        *2 {return 2}
        *3 {return 2}
        *4 {return 2}
        default {return 3}
    }
}

# Выводим сообщение о том, что скрипт удачно загружен.
putlog "
\[encounter\] $encounter(version) by $encounter(author) loaded"
}


Простите, не понял, где тут "приложить файл" :(
Не стал избавлятся от "лишних" колоров. просто присвоил им один цвет. Тестим далее, пока все работает :)
Нежелание играться - первый признак деградации ;)
Аватара пользователя
sad
 
Сообщения: 28
Зарегистрирован: 15 авг 2010 16:17
Откуда: Комсомольск-на-Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21+suzi

Re: Encounter - парсинг страницы

Сообщение tvrsh » 27 окт 2010 15:18

Не льсти себе, проблема была решена после моей подсказки, а не твоим, так называемым, "пожертвованием колоризацией". В чем эта жертва? В том, что ты изменил цвета? Чушь, от изменения цвета скрипт не может заработать или сломаться.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Encounter - парсинг страницы

Сообщение sad » 07 ноя 2010 17:26

Проблема, о которой идет речь, была здесь:
<Vesemir> Предстоящие игры: Точки (#119) Тыдыщ!.
<Vesemir> Играем: Командами (ограничение 7 человек).
<Vesemir> Последовательность прохождения: Нет данных.
<Vesemir> Минимальный пробег: 100.
<Vesemir> Авторы игры: Нет данных.

После этого бот ничего больше не отдавал.

То есть строчка
regexp {Автор игры: (.*?)</td>} $data "" author

давала "затык" в обработке данных. Поскольку бывают и "Авторы игры:", то стоку пришлось переделать
regexp {Ав(.*?)</td>} $data "" author

Я про это. Я даже не думал обольщатся своей гениальностью, просто указал на то, что применение regexp в данном случае - отсутствие информации, поскольку позиции бывают не статичными. а динамичными. А в следствие изменений строка полностью стала одного цвета. Пришлось править и остальные строки, чтобы привести всё к одному виду.
В итоге парсит правильно, но все в одном цвете.
Нежелание играться - первый признак деградации ;)
Аватара пользователя
sad
 
Сообщения: 28
Зарегистрирован: 15 авг 2010 16:17
Откуда: Комсомольск-на-Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21+suzi

Re: Encounter - парсинг страницы

Сообщение tvrsh » 07 ноя 2010 17:31

Тогда после
regexp {Автор игры: (.*?)</td>} $data "" author
просто добавь
regexp {Авторы игры: (.*?)</td>} $data "" author
Если не сработает первый то сработает второй регэксп. Ну или сделать так
regexp {Автор.*? игры: (.*?)</td>} $data "" author
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi


Вернуться в Заявки на скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron