Телевизоры Samsung Smart Tv » » nStreamLmod_v.3.x » Динамическое обновления информации в окне описания канала.

Страниц (1): [1]
 

1. FIOKOM - 04 Мая, 2015 - 12:18:01 - перейти к сообщению
В виджете есть специальная функция "parser", с помощью которой можно скачивать содержимое любых страничек и текстовых документов и обрабатывать его по заданному алгоритму.

Сама по себе эта функция сложная , но если вы её освоите , то она вам много где может пригодится.
Нужны небольшие навыки программирования и умение работать с регулярными выражениями.

Простейшая работа c "parser" без регулярных выражений :
CODE:
<parser>адрес странички|метка начала поиска|метка конца поиска<parser>

Загружается вся страничка и вырезается кусок текста между метками .
Если в полученной строке вы хотите что-то заменить или вырезать , то делается такая конструкция :
CODE:
<parser>адрес странички|метка начала поиска|метка конца поиска|что хотите заменить|на что заменить<parser>

Замен может быть сколько угодно.

Пример с применением регулярных выражений:
CODE:

<description><![CDATA[<parser>https://pogoda.yandex.ru|@RegExp=<h1 class="title title_level_1">(.*?)</div><div class="current-weather__info-row current-weather__info-row_type_time">|1|другой город||@RegExp=<span([^>]*)>|<br>|@RegExp=<\/?(a\#/div\#/i\#/span)([^>]*)>||@RegExp=<br><br>|<br>|@RegExp=<h1([^>]*)>|<h2>|@RegExp=<\/h1><br>|</h2>|&thinsp;|</parser>]]></description>


CODE:
@RegExp=<h1 class="title title_level_1">(.*?)</div><div class="current-weather__info-row current-weather__info-row_type_time">
этот код вместо метки начала поиска делает поиск в строке с помощью регулярного выражения .

"@RegExp" - это виртуальный указатель использования регулярного выражения.
Для поиска результата используется функция match().
CODE:
Результат поиска = (Полученная с сайта строка).match(new RegExp("<h1 class=\"title title_level_1\">(.*?)</div><div class=\"current-weather__info-row current-weather__info-row_type_time\">","gm"));

"Результатом поиска" будет массив из всех найденных вариаентов.
Вместо метки конца поиска можно задать порядковый номер элемента массива или символ через который суммируются все элементы массива . Если ничего не задано , то все элементы просто суммируются.
Можно ещё через "," просто перечислить нужные элементы и указать через что их суммировать.
Допустим в результате поиска с помощью регулярного выражения мы получили массив Arr из 5-ти элементов и хотим получить результирующую строку по формуле :
CODE:
Результирующая строка =Arr[0]+"<b>"+Arr[1]+Arr[3]+"<p>"+Arr[4];

Чтобы так получилось метку конца поиска надо заменить на - "1:<b>,2,4:<p>,5"

"@RegExpE" - для поиска будет применяться функция exec();
Про различия функций можно прочитать например ЗДЕСЬ.

Фильтрация и замена в найденном то же может быть произведена с помощью регулярного выражения .
Пример замены всех тегов "<span ......... >" на "<br>";

Что заменяем - "@RegExp=<span([^>]*)>"
На что заменяем - "<br>"

CODE:
результат поиска=(результат поиска).replace(new RegExp("<span([^>]*)>" ,"gm"),"<br>");



Вариант с погодой с Яндекса может работать не у всех , поэтому вот ещё два примера:
CODE:

<channel>
<title><![CDATA[pogoda]]></title>
<description><![CDATA[<parser>http://www.gismeteo.ru|@RegExp=<div class="scity">([\s\S]*?)<a class="icon fcast"||@RegExp=\n||@RegExp=<span([^>]*)>|<br>|@RegExp=<\/?(a\#/div\#/i\#/dl\#/dt\#/dd\#/span)([^>]*)>?|</parser>]]></description>
<playlist_url>stop</playlist_url>
</channel>
<channel>
<title><![CDATA[pogoda]]></title>
<description><![CDATA[<parser>http://www.gismeteo.ru|<div class="scity">|<a class="icon fcast"|@RegExp=\n||@RegExp=<span([^>]*)>|<br>|@RegExp=<\/?(a\#/div\#/i\#/dl\#/dt\#/dd\#/span)([^>]*)>?|</parser>]]></description>
<playlist_url>stop</playlist_url>
</channel>


Вариант который выводит результат в виде текста, чтобы можно было увидеть результат работы парсера :
CODE:
<channel>
<title><![CDATA[pogoda]]></title>
<description><![CDATA[<parser>http://www.gismeteo.ru|@RegExp=<div class="scity">([\s\S]*?)<a class="icon fcast"|test|@RegExp=\n||@RegExp=<span([^>]*)>|<br>|@RegExp=<\/?(a\#/div\#/i\#/dl\#/dt\#/dd\#/span)([^>]*)>?|</parser>]]></description>
<playlist_url>stop</playlist_url>
</channel>
2. stav - 01 Сентября, 2015 - 21:55:35 - перейти к сообщению
Подскажите , почему не работает этот вариант с погодой от sinoptik.ua ???

CODE:
<channel>
<title><![CDATA[Pogoda Kharkiv sinoptik.ua]]></title>
<description><![CDATA[<parser>https://ua.sinoptik.ua|@RegExp=<div class="scity">|<a class="icon fcast"|@RegExp=\n||@RegExp=<span([^>]*)>|<br>|@RegExp=<\/?(a\#/div\#/i\#/dl\#/dt\#/dd\#/span)([^>]*)>?|</parser>]]></description>
<playlist_url>stop</playlist_url>
</channel>
3. FIOKOM - 01 Сентября, 2015 - 21:57:19 - перейти к сообщению
stav
Потому что для каждого конкретного случая нужно составлять свой парсер.

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.034]     [ Gzipped ]