Что нового

Получение данных из HTML посредством RegExp шаблона

Alexaut

Новичок
Сообщения
23
Репутация
1
Из странички http://www.photosight.ru/users/192327/ пытаюсь вытащить число фотографий автора (124). Запись в строке
Код:
<li><a href="/users/192327/">Фотографии автора:</a> <span class="number">124</span></li>
- Как это универсальнее и проще всего сделать, чтобы потом применить аналогичную методику для вывода и других элементов - "Имя", "Просмотров фотографий" и т.д. с этой и других страничек? - За отвлечения на тему общих принципов парсинга, рекомендацию хорошей учебной литературы по теме (не сильно толстой!) - буду особенно признателен.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Парсинг html-странички - путеводитель для новичка

Alexaut [?]
ытаюсь вытащить число фотографий автора

Получение из кода всей страницы :
Код:
$sHTML=ClipGet();HTML-Текст страницы
$sPatern = '<a href=[^>]+?>(Фотографии автора:)</a>[^>]+?"number">(\d+)</'
$aResult = StringRegExp( $sHTML, $sPatern, 3 )
MsgBox(0,"Info",$aResult[0]& $aResult[1])




Добавлено:
Сообщение автоматически объединено:

Alexaut [?]
Как это универсальнее и проще всего сделать, чтобы потом применить аналогичную методику для вывода и других элементов - "Имя", "Просмотров фотографий" и т.д

Часть элементов можно получить так:
Код:
#Include<Array.au3>	
$sPatern = '<a href=[^>]+?>(.+)</a>[^>]+?"number">(\d+)</'
$aResult = StringRegExp( $sHTML, $sPatern, 3 )
_ArrayDisplay($aResult,"$aResult")




Добавлено:
Сообщение автоматически объединено:

И еще информация :
Код:
#Include<Array.au3> 
$sHTML=ClipGet();HTML-Текст страницы	
$sPatern = "(?smi)(?:<dt>|<dd>)([^&\s].*?)<"
$aResult = StringRegExp( $sHTML, $sPatern, 3 )
_ArrayDisplay($aResult,"$aResult")



Добавлено:
Сообщение автоматически объединено:

А так более универсальный шаблон :
Код:
$sPatern = '(?smi)(?:<dt>|<dd>|<a href="/users/\d+/.*?>|"number">)([^&\s].*?)</'
$aResult = StringRegExp( $sHTML, $sPatern, 3 )
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
Re: Парсинг html-странички - путеводитель для новичка

gregaz, sngr - Спасибо!

gregaz

1) Похоже, задачи парсинга элементов странички процентов на 90 решаются с использованием регулярных выражений. Если не сложно - прокомментируйте, пожалуйста, код последнего регулярного выражения:
Код:
$sPatern = '(?smi)(?:<dt>|<dd>|<a href="/users/\d+/.*?>|"number">)([^&\s].*?)</'

2) Прежде чем дойти до регулярных выражений, надо выделить из html-массива строку, с которой будет работать StringRegExp. Как это сделать в данном примере? -

Код:
#include "IE.au3"
#include "Array.au3"

$sUrl = "http://www.photosight.ru/users/221703/"
$oIE = _IECreate($sUrl)
$sText = _IEDocReadHTML ($oIE)

; ... КАК СВЯЗАТЬ ОТКРЫТЫЙ html-ДОКУМЕНТ С РЕГУЛЯРНЫМ ВЫРАЖЕНИЕМ?

$sHTML=ClipGet();HTML-Текст страницы

$sPatern = '(?smi)(?:<dt>|<dd>|<a href="/users/\d+/.*?>|"number">)([^&\s].*?)</'
$aResult = StringRegExp( $sHTML, $sPatern, 3 )
MsgBox(0,"Info",$aResult[0]& $aResult[1])


PS. Как поменять регулярное выражение, чтобы вынималось только численное значение (124), без "фотографии автора:"?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Парсинг html-странички - путеводитель для новичка

Alexaut [?]
Прежде чем дойти до регулярных выражений, надо выделить из html-массива строку, с которой будет работать StringRegExp. Как это сделать в данном примере? -

Не надо .
Регулярное выражение составлено для всего HTML-текста страницы



Добавлено:
Сообщение автоматически объединено:

Т.е. :
Код:
$sHTML = _IEDocReadHTML ($oIE)


Я предполагал,что HTML-текст страницы занесется в буфер обмена . (Копировать)
а затем его можно получить их буфера ф-ей: $sHTML=ClipGet().


Добавлено:
Сообщение автоматически объединено:

Alexaut [?]
Похоже, задачи парсинга элементов странички процентов на 90 решаются с использованием регулярных выражений

Не обязательно. Можно и с помощью библиотеки IE.au3
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
Re: Парсинг html-странички - путеводитель для новичка

Я так делал:

Код:
#include "IE.au3"
#include "Array.au3"

$sUrl = "http://www.photosight.ru/users/221703/"
$oIE = _IECreate($sUrl)
$sHTML = _IEDocReadHTML ($oIE)

$sHTML=ClipGet();HTML-Текст страницы

$sPatern = '(?smi)(?:<dt>|<dd>|<a href="/users/\d+/.*?>|"number">)([^&\s].*?)</'
$aResult = StringRegExp( $sHTML, $sPatern, 3 )
MsgBox(0,"Info",$aResult[0]& $aResult[1])


Получаю сообщение:
Код:
C:\Users\Averatec User\Documents\AutoIt\???????????\untitled.au3 (12) : ==> Subscript used with non-Array variable.:
MsgBox(0,"Info",$aResult[0]& $aResult[1])
MsgBox(0,"Info",$aResult^ ERROR
>Exit code: 1    Time: 12.467

В чем загвоздка?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Парсинг html-странички - путеводитель для новичка

Зачем дважды :
не :
Код:
$sHTML = _IEDocReadHTML ($oIE)

$sHTML=ClipGet();HTML-Текст страницы


А просто :
Код:
$sHTML = _IEDocReadHTML ($oIE)


Смотреть надо весь массив через : _ArrayDisplay($aResult,"$aResult")



Добавлено:
Сообщение автоматически объединено:

Alexaut [?]
Если не сложно - прокомментируйте, пожалуйста, код последнего регулярного выражения:

(?smi) - это объединенные флаги : (?m)(?s)(?i)
где (?i) - независимоcть от регистра символов
(?m) в многострочном тексте символы ^ и $ означают начало и конец строки соответственно, иначе начало и конец текста
(?s) символ "точка" (.) дополнительно включает в себя перенос строки в многострочных текстах, иначе только любой символ
(?:<dt>|<dd>|<a href="/users/\d+/.*?>|"number">) - группа с символами : "|" (ИЛИ) - здесь перечислены нужные фрагменты тегов

Т.е. в результирующий массив попадают фрагменты ,находящиеся в скобке : ([^&\s].*?), а это:
все. что находится между тегами <dt> (или <dd> или фрагментом <a href="/users/\d+/.*?>|"number">) и </


([^&\s].*?)
Здесь исключаются строки , начинающиеся с символа '&' и с пробела "\s"
.*? Любое("?"минимально возможное) число символов


Добавлено:
Сообщение автоматически объединено:

Вот как у тебя это будет выглядеть (надо дождаться полной загрузки страницы) :
Код:
#include "IE.au3"
#include "Array.au3"

$sUrl = "http://www.photosight.ru/users/221703/"
$oIE = _IECreate($sUrl)
$sHTML = _IEDocReadHTML ($oIE)

$sPatern = '(?smi)(?:<dt>|<dd>|<a href="/users/\d+/.*?>|"number">)([^&\s].*?)</'
$aResult = StringRegExp( $sHTML, $sPatern, 3 )

_ArrayDisplay($aResult, "$aResult" )
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
Re: Парсинг html-странички - путеводитель для новичка

gregaz

"Вот как у тебя это будет выглядеть (надо дождаться полной загрузки страницы) :"

Хорошо, - при этом мы получаем огромный массив сырых значений, которые еще нужно будет обработать (кстати, количества фото автора среди них нет). Пробую подставить в переменную $sPatern предыдущие паттерны, - они в данном случае не работают. - А как, все-таки, получить на выводе ЕДИНСТВЕННОЕ числовое значение: количество фото автора?
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
Re: Парсинг html-странички - путеводитель для новичка

gregaz

... MsgBox выдает "Альбомы автора:" ...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: Парсинг html-странички - путеводитель для новичка

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Парсинг html-странички - путеводитель для новичка" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Модератор раздела.









Предупреждение
Alexaut на будущее, пожалуйста, ставьте вопрос более конкретно, и подходите более продумано к выбору раздела.
Раз уж тут пошёл разговор о регулярных выражениях, то переношу тему в соответствующий раздел.
Если вам сложно придумать название темы воспользуйтесь разделом "Придумываем названия тем для новичков"

С уважением, Модератор раздела.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Парсинг html-странички - путеводитель для новичка

Alexaut [?]
... MsgBox выдает "Альбомы автора:" ...

Шаблон был составлен для другой страницы (см. твой верхний пост)

На этой же странице (в отличии от той ) слово number записано без кавычек
С учетом этого измени шаблон на :
Код:
$sPatern = '(?smi)(?:<dt>|<dd>|<a href="/users/\d+/.*?>|"?number"?>)([^&\s].*?)</'


Он должен работать независимо от наличия кавычек


Добавлено:
Сообщение автоматически объединено:

Alexaut [?]
Хорошо, - при этом мы получаем огромный массив сырых значений, которые еще нужно будет обработать
Ты же сам просил универсальный способ :
[?]
Как это универсальнее и проще всего сделать, чтобы потом применить аналогичную методику для вывода и других элементов - "Имя", "Просмотров фотографий" и т.д. с этой и других страничек?

Откуда мне знать что скрывается под и т.д.



Добавлено:
Сообщение автоматически объединено:

Если тебе надо только число фотографий, то :
Код:
$sHTML = _IEDocReadHTML ($oIE)
$sPatern = '(?smi).*?number"?>([^&\s].*?)<.*'
$sResult = StringRegExpReplace( $sHTML, $sPatern, '\1', 1 )
If @Error Then 
   MsgBox(16,'', "Информация отсутствует")
Else
    MsgBox(48,'Количество фотографий :', $sResult)
EndIf
 
Автор
A

Alexaut

Новичок
Сообщения
23
Репутация
1
Re: Парсинг html-кода регулярными выражениями для самых маленьких

gregaz

Спасибо, - последний вариант - то, что надо! - хорошая формочка для самых маленьких по отработке способов вытаскивания информации с html-страничек посредством регулярных выражений ! :smile:

Код:
#include "IE.au3" 
#include "Array.au3"

$sUrl = "http://www.photosight.ru/users/221703/"; Адрес html-странички, - можно задать любой.
$oIE = _IECreate($sUrl); Открываем страничку в IE8 (версию желательно использовать восьмую - с девяткой могут быть проблемы)
$sHTML = _IEDocReadHTML ($oIE); Читаем всю страничку как html-код - далее можно переходить к регулярным выражениям - самому универсальному средству вытащить информацию со странички

$sPatern = '(?smi).*?number"?>([^&\s].*?)<.*'; Составляем шаблон регулярного выражения, по которому вытаскивается нужная нам информация. Шаблоны индивидуальны для каждой задачи и странички. Шаблон - сердце парсинга, здесь можно поупражняться в составлении и подставлять любой. Начальная инфа по регулярным выражениям: http://autoit-script.ru/index.php/topic,4901.0.html, также есть в хелпе, но там мало и не системно.
$sResult = StringRegExpReplace( $sHTML, $sPatern, '\1', 1 ); Прогоняем страничку по шаблону. Если шаблон составлен верно, - получаем результирующую переменную $sResult с нужным нам значением

MsgBox(48,'Количество фотографий :', $sResult); Чтобы проверить верен ли полученный результат - можно вывести его с помощью MsgBox или, если результат массив, - массивом _ArrayDisplay
 
Верх