I live ExBB and CMS Limbo! » Разное » Rainmeter - изменяем интерфейс рабочего стола » WebParser: использование StringIndex2

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

1. технарь - 23 марта 2017 — 22:26 - перейти к сообщению
Для эффективного использования плагина WebParser в целях получения повторяющихся данных из RSS-ленты или сайта погоды, следует использовать параметр StringIndex2 .

В мануале про этот параметр можно прочитать следующее:
StringIndex2
Этот параметр используется для RegExp параметра в Мере, использующую данные из другой Меры WebParser (т. е. URL-адрес указывает на родительскую меру). В этом случае StringIndex определяет индекс результата выражения родительской меры, а StringIndex2 определяет индекс RegExp выражения (т. е. определяет строку, возвращаемую меру).

Для примера давайте получим некоторые данные со страницы https://docs.rainmeter.net/

Исходный код этой страницы на момент написания данной статьи выглядел так:
Спойлер (Показать)

Код скина, который будем разбирать, выглядит так:
Спойлер (Показать)

В результате выполнения этого кода получаем такой результат.



Давайте теперь пошагово разберём, что делает этот код.

Во первых определены две переменные, причем одна из них используется в RegExp
PHP:
[Variables]
Url=https://docs.rainmeter.net
Item=.*<h2>(.*)</h2>

Затем в коде используется плагин WebParser для получения информации с сайта.

PHP:
[MeasureSite]
Measure=Plugin
Plugin=WebParser
Url=#Url#
RegExp="(?siU)<title>(.*)</title>#Item##Item##Item#.*"


В формировании параметра RegExp использована заранее объявленная переменная Item. Если эту переменную заменить её значением, то в итоге видим 4 точки захвата кода.
 Цитата:
RegExp="(?siU)<title>(.*)</title>.*<h2>(.*)</h2>.*<h2>(.*)</h2>.*<h2>(.*)</h2>.*"

Обратите внимание на одну особенность. Вместо того, что бы сразу разобрать весь сайт на многочисленные StringIndexes, мы только в первом StringIndexes сразу получаем результат, а вот в StringIndexes 2, 3 и 4 захватываем куски сырого кода между тегами <h2> и </h2>.
Вот этими кусками сырого кода мы в дальнейшем и займёмся.

PHP:
[MeasureItem1Title]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
DecodeCharacterReference = 1
RegExp="(?siU)">(.*)</a>"
StringIndex=2
StringIndex2=1

Мы видим, что снова используется плагин WebParser, но в качестве параметра Url используется указание на другую месуру MeasureSite
В этом случае параметр StringIndex определяет индекс куска кода, который следует взять из MeasureSite и уже к этому куску кода применяется свой RegExp
В результате этого может быть захвачено снова несколько элементов и уже на эти элементы ссылается другой параметр - StringIndex2

Применительно к конкретному примеру из MeasureSite будет взят кусок кода с индексом 2 (StringIndex=2) и после поиска будет выбран элемент с индексом 1 (StringIndex2=1).

Следующая месура работает аналогично, но имеет свой RegExp
PHP:
[MeasureItem1Link]
Measure=Plugin
Plugin=WebParser
Url=[MeasureSite]
RegExp="(?siU)<a (.*)">"
StringIndex=2
StringIndex2=1
Substitute='href="':"#Url#"

Аналогично повторим те же операции, но для StringIndex=3 и StringIndex=4

В общем можно дать совет использовать плагин WebParser именно по такой схеме.
Первая, главная месура делает запрос к сайту и захватывает максимально необходимое количество даных (зачастую это может быть вся страница сайта целиком). А затем создаются вспомогательные месуры, которые ссылаются на главную и разбирают её данные. Этим достигается минимум запросов к интернет ресурсу, т.к. при слишком частых запросах сервер может принять работу WebParser за атаку на ресурс. Так же использование подобной схемы позволяет обойти ограничение в 99 StringIndex для одной месуры.
2. wasek - 6 часов 36 минут назад - перейти к сообщению
StringIndex=2
StringIndex2=1

Никогда так не делал, не вижу смысла . Как по мне , так проще главной мессурой захватить сразу определенный кусок кода сайта и его разобрать а не весь код целиком .
1. Проще со скином работать
2. Если на сайте произойдет изменение кода , "ляжет" не весь скин а только та часть где были изменения.

Powered by ExBB v1.1.180311