Русское сообщество AutoIt

  • Май 22, 2012, 13:43:59 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:


Последняя финальная версия AutoIt: 3.3.8.1 (Скачать)
Последняя Beta версия AutoIt: 3.3.9.4 (Скачать)

Реклама

Автор Тема: Получение данных из HTML посредством RegExp шаблона  (Прочитано 1428 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Alexaut [?]

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



  Записан

sngr [?]

  • Продвинутый
  • ***
  • Репутация: 91
  • Offline Offline
  • Сообщений: 254
  • Версия AutoIt: 3.3.8.1
    • Награды




  Записан

gregaz [?]

  • AutoIt Гуру
  • *****
  • Репутация: 231
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 939
  • Версия AutoIt: 3.3.6.1
    • Награды
Alexaut  [?]
Цитата
ытаюсь вытащить число фотографий автора

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



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

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



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


Добавлено: Ноябрь 06, 2011, 10:14:26
А так более универсальный шаблон :
Код: AutoIt [Выделить]
$sPatern = '(?smi)(?:<dt>|<dd>|<a href="/users/\d+/.*?>|"number">)([^&\s].*?)</'
$aResult = StringRegExp( $sHTML, $sPatern, 3 )
 
« Последнее редактирование: Ноябрь 06, 2011, 10:14:27 от gregaz, Причина: Объединение сообщений »



  Записан
Самая большая проблема – её сформулировать. 

Alexaut [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 0
  • Offline Offline
  • Сообщений: 23
  • Версия AutoIt: 3.3.6.1.
    • Награды
gregaz, sngr - Спасибо!

gregaz

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

Код: AutoIt [Выделить]
#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), без "фотографии автора:"?
« Последнее редактирование: Ноябрь 06, 2011, 15:56:19 от Alexaut »



  Записан

gregaz [?]

  • AutoIt Гуру
  • *****
  • Репутация: 231
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 939
  • Версия AutoIt: 3.3.6.1
    • Награды
Alexaut  [?]
Цитата
Прежде чем дойти до регулярных выражений, надо выделить из html-массива строку, с которой будет работать StringRegExp. Как это сделать в данном примере? -

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



Добавлено: Ноябрь 06, 2011, 16:02:06
Т.е. :
Код: AutoIt [Выделить]
$sHTML = _IEDocReadHTML ($oIE)

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


Добавлено: Ноябрь 06, 2011, 16:08:28
Alexaut  [?]
Цитата
Похоже, задачи парсинга элементов странички процентов на 90 решаются с использованием регулярных выражений

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

« Последнее редактирование: Ноябрь 06, 2011, 16:08:28 от gregaz, Причина: Объединение сообщений »



  Записан

Alexaut [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 0
  • Offline Offline
  • Сообщений: 23
  • Версия AutoIt: 3.3.6.1.
    • Награды
Я так делал:

Код: AutoIt [Выделить]
#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 Гуру
  • *****
  • Репутация: 231
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 939
  • Версия AutoIt: 3.3.6.1
    • Награды
Зачем дважды :
не :
Код: AutoIt [Выделить]

$sHTML = _IEDocReadHTML ($oIE)

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

А просто :
Код: AutoIt [Выделить]
$sHTML = _IEDocReadHTML ($oIE)
 

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



Добавлено: Ноябрь 06, 2011, 16:32:50
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"
.*? Любое("?"минимально возможное) число символов


Добавлено: Ноябрь 06, 2011, 16:51:34
Вот как у тебя это будет выглядеть (надо дождаться полной загрузки страницы) :
Код: AutoIt [Выделить]
#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" )
 
« Последнее редактирование: Ноябрь 06, 2011, 16:51:34 от gregaz, Причина: Объединение сообщений »



  Записан

Alexaut [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 0
  • Offline Offline
  • Сообщений: 23
  • Версия AutoIt: 3.3.6.1.
    • Награды
gregaz

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

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




  Записан

gregaz [?]

  • AutoIt Гуру
  • *****
  • Репутация: 231
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 939
  • Версия AutoIt: 3.3.6.1
    • Награды
Alexaut  [?]
Цитата
числовое значение: количество фото автора?

Код: AutoIt [Выделить]
MsgBox(0,'',$aResult[1])




  Записан

Alexaut [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 0
  • Offline Offline
  • Сообщений: 23
  • Версия AutoIt: 3.3.6.1.
    • Награды
gregaz

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




  Записан

Garrett [?]

  • Модератор
  • *
  • *****
  • Репутация: 548
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 2056
  • Версия AutoIt: 3.3.6.1
    • Награды
ПредупреждениеЗа нарушение правил форума (пункт Б.5):
Цитата
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.

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

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

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

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




  Записан

--------------------------------------------------------------------------------------------------
Все стандарты Document Object Model HTML
--------------------------------------------------------------------------------------------------
«Жизнь – цепь, а мелочи в ней – звенья. Нельзя звену не придавать значения!»

gregaz [?]

  • AutoIt Гуру
  • *****
  • Репутация: 231
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 939
  • Версия AutoIt: 3.3.6.1
    • Награды
Alexaut  [?]
Цитата
... MsgBox выдает "Альбомы автора:" ...

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

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

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


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

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



Добавлено: Ноябрь 06, 2011, 19:17:49
Если тебе надо только число фотографий, то :
Код: AutoIt [Выделить]
$sHTML = _IEDocReadHTML ($oIE)
$sPatern = '(?smi).*?number"?>([^&\s].*?)<.*'
$sResult = StringRegExpReplace( $sHTML, $sPatern, '\1', 1 )
If @Error Then
   MsgBox(16,'', "Информация отсутствует")
Else
    MsgBox(48,'Количество фотографий :', $sResult)
EndIf
« Последнее редактирование: Ноябрь 06, 2011, 19:34:05 от gregaz, Причина: Объединение сообщений »



  Записан

Alexaut [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 0
  • Offline Offline
  • Сообщений: 23
  • Версия AutoIt: 3.3.6.1.
    • Награды
gregaz

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

Код: AutoIt [Выделить]
#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




  Записан
 


Похожие темы
Тема Автор Ответов Просмотров Последний ответ
[RegExp] Регулярное выражение из HTML
Регулярные выражения и прочее
LepreconSTR 1 1474 Последний ответ Июнь 20, 2010, 07:20:35
от gregaz
[RegExp] Регулярное выражение для парсинга html-содерджимого
Регулярные выражения и прочее
Waik 23 3066 Последний ответ Сентябрь 25, 2010, 10:42:18
от Kaster
[RegExp] Извлечение текста из html кода
Регулярные выражения и прочее
kosjachok 6 1818 Последний ответ Ноябрь 25, 2010, 14:25:44
от gregaz
Поиск данных в HTML и выдергивание данных
AutoIt для новичков
zip-per 2 769 Последний ответ Февраль 11, 2011, 23:35:44
от zip-per
[RegExp] Извлечь массив данных из HTML
Регулярные выражения и прочее
Houl777 4 1228 Последний ответ Февраль 24, 2011, 14:36:53
от Houl777
[Сеть, интернет] Получение HTML web-страницы без браузера
AutoIt для новичков
Kroid 14 1633 Последний ответ Август 09, 2011, 15:10:50
от HelpMe
[RegExp] Поиску в html мешают скобки
Регулярные выражения и прочее
Alexl82 3 837 Последний ответ Март 31, 2011, 11:16:26
от Alexl82
[Сеть, интернет] Получение информации из html странички
Регулярные выражения и прочее
cobra2029 3 725 Последний ответ Июль 13, 2011, 18:15:50
от CreatoR
получение значения переменных из названий папок и файлов с помощью шаблона
Регулярные выражения и прочее
black1 7 575 Последний ответ Январь 29, 2012, 02:31:14
от black1
[RegExp] Вытащить текст из html кода имеющего много кавычек
Регулярные выражения и прочее
_Lexa98_ 5 391 Последний ответ Март 01, 2012, 12:21:34
от _Lexa98_


Реклама