Что нового

[Данные, строки] Сбор информации с web-таблицы

eLDeus

Новичок
Сообщения
8
Репутация
0
Добрый день!

На web-страничке есть нужная строка с порядковым номером (118, иногда она же 117-ая) и статичным названием (на конце - 2 буквы TA). В 16 столбце для этой строки содержится нужная информация, которая время от времени изменяется, это время и дата. Так вот нужно эти значения извлекать в текстовый файл (а лучше в excel) по расписанию.
Собственно, пока не знаю с чего начать, неплохо было бы понять, как указать для поиска 16 столбец относительно 118 строки.

Заранее спасибо

np4eq0.jpg
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
eLDeus
Пример страницы в виде файла не помешал бы.
Если же страница одна, и там действительно таблица, то скорее всего возможно через функции автоматизации IE получить всю таблицу в массив, и разбираться дальше. Ну, или через регулярные выражения - тут тем более нужен пример страницы...

Можно попробовать запустить такой код перебора таблиц на странице:

Код:
#include <IE.au3>
#include <Array.au3>

$oIE=_IECreate ('http://www.yandex.ru') ; адрес или путь до файла веб-страницы

$i=-1

$oElements = _IETagNameAllGetCollection ($oIE)

For $oElement In $oElements
If $oElement.tagname ='TABLE' Then

$i=$i+1
;If StringInStr ($oElement.innerText,'текст')<> 0 Then ; доп условие по тексту внутри таблицы

MsgBox(0, 'Element Info', $i) ; индекс таблицы для прямого обращения к ней в дальнейшем

$oTable = _IETableGetCollection($oIE,$i)
$avArray = _IETableWriteToArray($oTable)
_ArrayDisplay($avArray)

;Endif
EndIf
Next


По идее, нужная таблица считается в массив и отобразится.
Правда, не знаю, правильно ли сработает, т.к. по скрину видно, что размер таблицы очень большой...
 
Автор
E

eLDeus

Новичок
Сообщения
8
Репутация
0
Спасибо за ответ!

Теперь, когда я дернул кусок странички и набросал алгоритм, еще раз уточню про то, что нужно в конечном итоге. Необходим скрипт, который будет регулярно находить 16 и 18 столбцы, относящиеся к 117 строке (или 118, бывает и так, и так), в которых присутствует комбинация символов "(TA)" (со скобками) и извлекал из них часы и минуты времени, занося в excel-файл.

Мне нужна помощь именно в выражениях AutoIt, которых я пока не знаю.
А вот всю последовательность действий для скрипта я расписал:

Код:
[I] Алгоритм по 16-му столбцу

1) открыть страницу (//или таблицу)
2) найти в ней комбинацию символов "(TA)"
3) найти 16 столбец, относящийся к этой строке (// в нем будет дата в формате "ДД.ММ.ГГ ЧЧ.ММ.СС" из 17 символов)
    4а) условие 1: если дата = либо > текущего дня, 22:15 ("ДД.ММ.ГГ 22:15:00") (\\ сравнение по шкале времени), то: 
        4а.1) скопировать 10-14 символы значения даты (// ЧЧ.ММ) в c:\log.xls, ячейку C42
        4а.2) выставить шрифт=8 для ячейки C42
        4а.3) залить ячейку C41 цветом "ColorIndex = 4"
    4б. условие 2: если дата значения < текущего дня, 23:00 ("ДД.ММ.ГГ 23:00:00"), то:
        4б.1) залить ячейку C41 файла c:\log.xls цветом "ColorIndex = 6"


[II] Алгоритм по 18-му столбцу

1) открыть страницу (//или таблицу)
2) найти в ней комбинацию символов "(TA)"
3) найти 18 столбец, относящийся к этой строке (// в нем будет дата в формате "ДД.ММ.ГГ ЧЧ.ММ.СС" из 17 символов)
    4а) условие 1: если дата = либо > текущего дня, 23:00 ("ДД.ММ.ГГ 23:00:00") (\\ сравнение по шкале времени), то:
        4а.1) скопировать 10-14 символы значения даты (// ЧЧ.ММ) в c:\log.xls, ячейку C46
        4а.2) выставить шрифт=8 для ячейки C46
        4а.3) залить ячейку C45 цветом "ColorIndex = 4"
    4б. условие 2: если дата значения < текущего дня, 23:00 ("ДД.ММ.ГГ 23:00:00"), то:
        4б.1)залить ячейку C45 файла c:\log.xls цветом "ColorIndex = 6"

значение времени, которыое присутствует в этой таблице:

Код:
13.07.12 23:58:52 (// время из 16 столбца)
14.07.12 00:00:02 (// время из 18 столбца)

содержание web-странички только для 117 строки включая все столбцы, которые к ней относятся, в том числе и те, из которых нужно извлечь значение времени.

Код:
<td valign="top"> 117</td>


			<td valign="top"> some.table.title.1
(TA) </td>
			<td valign="top"> no </td>

			<td valign="top"> no </td>
			<td valign="top"> no </td>
				
				<td bgcolor="orange" valign="top">not configured</td>


			
            <td valign="top"></td>

            <td>  </td>
             <td> NORMAL </td>
             <td> 1 </td>    
		 
             <td>  </td> 
		
				<td valign="top"> 

				
				 </td>


			<td valign="top"> 6 </td>
			<td valign="top"> 6 </td>
			<td valign="top"> 0  </td>
			<td valign="top"> 13.07.12 23:58:52 </td>
			<td valign="top"> 14.07.12 00:00:02  </td>
			<td valign="top"> 14.07.12 00:00:02  </td>
			<td valign="top">  </td>
			

						<td valign="top">
			
				 </td>
			
			
			<td valign="top"> NORMAL </td>
			<td valign="top"> 1m 9,8s </td>
			<td valign="top"> 1m 4s </td>
			<td valign="top"> 1m 29,7s </td>
			<td valign="top"> 1m 14,1s </td>
			<td valign="top"> 7m 24,7s </td>
			<td valign="top"> some.table.title.2 </td>
			
			<td valign="top"> T.A.K. </td>
			</tr>
				
				<tr class="stats">

Большое спасибо за проявленное внимание!
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
eLDeus
Код, приведенный выше пробовали запускать? Получается таблицу получить?
Если бы удалось, то задача бы сильно упростилась...

Запись в ексель и т.п. - не так сложно, а вот правильное получение данных из таблицы - сложнее, т.к. для функций работы с текстом код страницы - просто длинная строка, непросто там указать столбец, строку, ячейку...

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

Код:
#include <Array.au3>
$sText=FileRead('c:\test.html') 
$avArray=StringRegExp($sText, '"top">(.*?)</td>', 3)
_ArrayDisplay($avArray)


Получим массив, в данном случае - что-то вроде содержимого ячеек таблицы для одной строки. Даты из массива выделить несложно, но их даже в приведенном примере получается три, какую из них нужно брать(какая относится к 16 столбцу)?
Далее, т.к., скорее всего, код все страницы не разделен на отдельные строки, то при обработке таким способом сразу всей страницы получится большой массив, содержащий много ненужных данных.

Поэтому, если я правильно понял условия, задачу можно упростить, просто найдя текст "(ТА)", отсчитать от него, скажем, 1200-1300 символов, и применять регулярное выражение уже к этому вырезанному тексту.

Код:
#include <Array.au3>
$sText=FileRead('c:\test.html')
$string=StringInStr ($sText,'(TA)')
$sText=StringMid($sText,$string,1200)
$avArray=StringRegExp($sText, '"top">(.*?)</td>',3)
_ArrayDisplay($avArray)

Возможно, не слишком красиво, но должно работать.

В любом случае, прямо указать нужный "столбец" или "ячейку" не получится.
Нужно смотреть, что покажут эти коды на всем тексте.
Если будет работать, то дальше можно будет думать о дальнейшей обработке.
 
Автор
E

eLDeus

Новичок
Сообщения
8
Репутация
0
WSWR
Прошу прощения за длительный ответ!

Последний код открыл массив как раз той самой нужной строки, отфильтровав всё лишнее! Только вот не понятно, что с отсчетом символов и как подсчитать их точное количество для дальнейшего использования?

получился следующий результат:



даты нужны только две, я их как раз выделил. В алгоритме, который я писал выше указано, как их использовать.

Только есть еще один нюанс. Путь к файлу (т.е. страничке) я пока использую локальный, но в действительности он на web-сервере, поэтому оканчивается не на htm, а на jsp. Если указывать сетевой путь, скрипт не срабатывает. Что можно предпринять?

Спасбио!
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
eLDeus
Если ссылка, то можно попробовать такой код:
Код:
#include <IE.au3>
#include <Array.au3>
$Url='' ; ссылка

$oIE = _IECreate($Url)
$sText=_IEDocReadHTML ($oIE)

$string=StringInStr ($sText,'(TA)')
$sText=StringMid($sText,$string,1200)
$avArray=StringRegExp($sText, '"top">(.*?)</td>',3)
_ArrayDisplay($avArray)


Я уж, честно говоря, забыл, что тут к чему и, собственно, что делать надо)
По количеству символов - а 1200 чем не подходит?
 
Автор
E

eLDeus

Новичок
Сообщения
8
Репутация
0
WSWR
Может че не так делаю, но я вставил ссылку в скрипт (заканчивается на .jsp). Просто открылась эта страница в IE и всё :-\



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

т.е. по предыдущему коду он открывал Array-окошко с массивом только по строке, содержащей сочетание "(TA)" то что я показал на скриншоте. Но там именно файл на харде открывался в htm, а тут ссылка .jsp. А по последнему коду кроме открытия самой этой страницы через IE ничего не происходит.
Также немного неясно, что с отсчетом 1200 символов, ведь нужно, чтобы 10-14 символы значения даты с открытого массива копировались в эксель-файлик. Как правильно посчитать количество символов, которые нужно отступить, чтобы скрипт скопировал то, что нужно?

Заранее спасибо за ответ!
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
eLDeus

Я возможно туплю, поэтому разделим задачу на 3 части:

1) Получение всего текста
Код:
_IEDocReadHTML ()
должна работать - это чтение текста страницы из сети через браузер.
Запустите такой код, что он напишет в нижнее окно редактора?
Код:
#include <IE.au3>
$Url= ''
$oIE = _IECreate($Url)
$sText=_IEDocReadHTML ($oIE)
ConsoleWrite($sText)


далее попробуйте запустить такой код:

Код:
$Url='' ; с http://
$sText= BinaryToString(InetRead($Url)) 
ConsoleWrite($sText)

Это загрузка страницы без браузера, напрямую. Что он напишет?

и еще можно такой код:
Код:
#include <INet.au3>
$Url='http://www.yandex.ru' ; с http://
ConsoleWrite(_INetGetSource($Url))


Если ничего не пишут эти коды, тогда не знаю, какие-то странные страницы это :blink:

2) По символам - так вроде и нужно только, ту строку, где "ТА"?
На скриншоте уже есть все, что нужно? Только 2 даты?
Нужны только строки 8 и 10, с промежутком? Они всегда будут через одну?
Если только эти строки, то вытащить их не трудно, даже если у них будут другие номера.

Ну вот хотя бы такой код, даже из сохраненного файла:

Код:
#include <Array.au3>
$sText=FileRead('C:\test.htm') 
$string=StringInStr ($sText,'(TA)')
$sText=StringMid($sText,$string,1200)
$avArray=StringRegExp($sText, '"top">(.*?)</td>', 3)
;_ArrayDisplay($avArray)
For $i=0 To UBound ($avArray)-1
If StringInStr($avArray[$i],':') Then

If StringInStr($avArray[$i-1],':')=0 And StringInStr($avArray[$i+1],':')>0 Then ConsoleWrite('Первая дата ' & StringMid($avArray[$i],10,14) & @CRLF)
If StringInStr($avArray[$i-1],':')>0 And StringInStr($avArray[$i+1],':')=0 Then ConsoleWrite('Вторая дата ' & StringMid($avArray[$i],10,14) & @CRLF)

EndIf
Next

Он выводит в нижнем окне редактора эти нужные строки?

OffTopic:
Я почему спрашиваю подробно - чтобы быстрее и точнее написать, то что нужно, до меня не сразу доходит, к сожалению :smile:


3)Ексель и т.д. - после успешного выполнения предыдущих пунктов.
 
Автор
E

eLDeus

Новичок
Сообщения
8
Репутация
0
WSWR
Возможно, я что-то не так делаю.. но, к сожалению, ни один код не дал результатов(

Первый ругается такой ошибкой:

xf8boj.jpg


при запуске остальных кодов появляется на 2-3 секунды значок AutoIt в трее и далее ничего не происходит :(

ссылки вставляю через http:// между одинарными ковычками после $Url=, а последнем примере после $sText=FileRead... Даже не знаю, в чем проблема может быть...
 
Автор
E

eLDeus

Новичок
Сообщения
8
Репутация
0
Это ты забыл
Код: AutoIt [Выделить]
#include <IE.au3>
да, забыл во второй раз, но, сейчас вспоминаю (да и только что попробовал еще раз) - с этим кодом IE просто открывает страничку, которую я прописываю в скрипт.
 

jam

Новичок
Сообщения
13
Репутация
0
Добрый день!

воспользовался рекомендацией WSWR, но, похоже, его метод вытаскивания информации о таблице из IE в Excel не применим для моих данных, т.к. скрипт:

Код:
#include <IE.au3>
#include <Array.au3>

$oIE=_IECreate ('http://www.arbworld.net/index.php/en/moneyway/mw-1-x-2')
$i=-1

$oElements = _IETagNameAllGetCollection ($oIE)

For $oElement In $oElements
If $oElement.tagname ='TABLE' Then

$i=$i+1

MsgBox(0, 'Element Info', $i) ; индекс таблицы для прямого обращения к ней в дальнейшем

$oTable = _IETableGetCollection($oIE,$i)
$avArray = _IETableWriteToArray($oTable)
_ArrayDisplay($avArray)


EndIf
Next


просто не видит таблицу на web-странице. похоже, ей не присвоен tagname ='TABLE'.
как в таком случае можно вытащить данные, представленные в табличном виде в Excel?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
#include <IE.au3>
#include <Array.au3>

$oIE=_IECreate ('http://www.arbworld.net/index.php/en/moneyway/mw-1-x-2')
$oTable = _IETableGetCollection($oIE, 2)
$avArray = _IETableWriteToArray($oTable)
_ArrayDisplay($avArray, '', -1, 1)
 

jam

Новичок
Сообщения
13
Репутация
0
Garrett, спасибо!

оказалось, что ошибка была с занесением данных в полученном массиве в Excel: ругалось на строчку 1912 в модуле IE.au3 (Local $a_TableCells[$i_cols][$i_rows]). :whistle:
я думал, ругается, потому что не видит таблицу на html странице.
 
Верх