Что нового

Не работает сохранение Таблиц в Массив с Internet Explorer 8

Lucky_spirit

Люблю играть на гитаре! :)
Сообщения
2
Репутация
0
Доброго времени суток всем! :smile:
Суть моей проблемы. Вот с этого сайта http://abc.kharkov.ua/catalog/index.php?main_page=products_all мне необходимо сохранить центральную таблицу с товарами. Делаю это следующим кодом:

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

; Открытие сайта ABC
$oIEabc = _IECreate ("http://abc.kharkov.ua/catalog/index.php?main_page=products_all")

;~ Сохранение таблицы со страницы
$oTable = _IETableGetCollection ($oIEabc)

;~ Подсчет количества
$iNumTables = @extended

;~ Слдующее MsgBox выдает сообщение о наличии 67 таблиц
MsgBox(0, "Table Info", "There are " & $iNumTables & " tables on the page")

;~ Собственно команда записи таблицы в массив
$aTableData = _IETableWriteToArray ($oTable)

;~ Присваивание временной переменной значения ошибки
$temp = @error

;~ Следующее MsgBox выдает код ошибки (у меня 4)
MsgBox(0, "Ошибка", $temp)

;~ Следующее MsgBox выдает 0 - т.е. отсутствие созданного массива
MsgBox(0, "Наличие массива", $aTableData)

$rows = UBound($aTableData)
$cols = UBound($aTableData, 2)
$dims = UBound($aTableData, 0)

MsgBox(0, "The " & $dims & "-dimensional array has", $rows & " rows, " & $cols & " columns")
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Lucky_spirit
Попробуйте так найти нужную Вам таблицу по ее индексу:
Код:
#include <array.au3>
#include <IE.au3>

$oIE = _IECreate("http://abc.kharkov.ua/catalog/index.php?main_page=products_all")

$oTableAll = _IETableGetCollection($oIE)
$iNumTables = @extended
MsgBox(0, '', $iNumTables)
For $i = 0 To $iNumTables - 1
	If $i <> 6 Then
		$oTable = _IETableGetCollection($oIE, $i)
		$aTableArray = _IETableWriteToArray($oTable)
		_ArrayDisplay($aTableArray, 'Table Index is: ' & $i)
	EndIf
Next
Вы справку по функции _IETableGetCollection() не внимательно прочитали.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Lucky_spirit [?]
Вот с этого сайта http://abc.kharkov.ua/catalog/index.php?main_page=products_all мне необходимо сохранить центральную таблицу с товарами.
Куда?
HTML код, текстовые данные?

Вот одно из возможных решений, получения текстовых данных без сохранения на диск:
Код:
#include <IE.au3>
#include <array.au3>

$oIE = _IECreate ("http://abc.kharkov.ua/catalog/index.php?main_page=products_all")

$aData = _Product($oIE) ; массив данных по товару ссылка + остальные данные
_ArrayDisplay($aData)

Func _Product($Object)
	Local $aData[1][2]
	$oTDs = _IETagNameGetCollection($Object,"td")
	If Not @error Then
		For $oTD In $oTDs
			If	$oTD.getAttribute('valign') == "top" And _ 
				$oTD.className == "main" And _ 
				$oTD.getAttribute('colspan') == 2 Then
				ReDim $aData[UBound($aData)+1][2]
				$aData[0][0] += 1
				$oLink = _IETagNameGetCollection($oTD, "a", 0)
				$aData[UBound($aData)-1][0] = $oLink.href ; Ссылка, для перехода на страницу с товаром, будет весьма кстати
				$aData[UBound($aData)-1][1] = StringReplace(StringStripWS(_IEPropertyGet($oTD,"innerText"), 4), @CR, "|") ; Остальные данные. По символу "|" в дальнейшем можно будет разделить данные
			EndIf
		Next
		SetError(0)
		Return $aData
	Else
		SetError(1)
		Return $aData
	EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
Снимаю шляпу. :thumbs_up:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles сказал(а):
Garrett
Снимаю шляпу. :thumbs_up:
madmasles :beer:

Нашёл проблему в своём коде. :(
Если посмотреть в массиве ячейку [6][1]
[box]К-моноблок Apple iMac (*MA876RSS|A)|Intel Core 2 Duo T7300 (2.0ГГц)|1024MB|250GB|20"|SuperMulti Double Layer|Модель: PC2910|Производитель: ABC|Цена: 12,208.00грн|Вес: 0кг.|Дата добавления: 06/07/2009[/box]
то видно, что заголовок сообщения разбился на части по символу "|"! Что не есть хорошо. :(
[box]К-моноблок Apple iMac (*MA876RSS|A)|Intel Core 2 Duo T7300 (2.0ГГц)|1024MB|250GB|20"|SuperMulti Double Layer[/box]

Это связано с тем, что в HTML документе, встречаются паразитные теги <bг>.
Попробовал разные варианты, и пришёл к выводу, что лучше с этой задачей справятся регулярные выражения! Но, увы, я с ними на вы.

Может, кто из гуру по RegExp`ам подсобит и приведёт данные из строки вида [box]К-моноблок Apple iMac (*MA876RSS A) Intel Core 2 Duo T7300 (2.0ГГц) 1024MB 250GB 20" SuperMulti Double Layer Модель: PC2910 Производитель: ABC Цена: 12,208.00грн Вес: 0кг. Дата добавления: 06/07/2009[/box] к виду:

[box]К-моноблок Apple iMac (*MA876RSS A) Intel Core 2 Duo T7300 (2.0ГГц) 1024MB 250GB 20" SuperMulti Double Layer|Модель: PC2910|Производитель: ABC|Цена: 12,208.00грн|Вес: 0кг.|Дата добавления: 06/07/2009[/box]

P.S. В поиске, я основывался на ключевых словах "Модель", "Производитель", "Цена", "Вес", "Дата добавления", всё остальное это заголовок. Поиск шёл от ключевого слова до первого пробела.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Lucky_spirit
Можно еще так попробовать:
Код:
#include <INet.au3>

$sText = ''
$sSourse = ''
$z = 0
$iPage = 5 ;кол-во страниц
$sUrl = 'http://abc.kharkov.ua/catalog/index.php?main_page=products_all&disp_order=1&page='
If Not Ping('abc.kharkov.ua') Then Exit
$Time = TimerInit()
$hFile = FileOpen('Товары.txt', 2)
For $j = 1 To $iPage
	$sSourse = _INetGetSource($sUrl & $j)
	If $sSourse Then
		$aSourse = StringRegExp($sSourse, '\Q<td colspan="2" valign="top" class="main">\E\r\n\h+<a href="(.*?)\Qbr clear="all" />            </td>\E', 3)
		If IsArray($aSourse) Then
			For $i = 0 To UBound($aSourse) - 1
				$z += 1
				$sText &= $z & '.' & @CRLF
				$sText &= 'Название: ' & StringRegExpReplace($aSourse[$i], '(?s).*?\Q"><strong>\E(.*?)\Q</strong>\E.*', '\1') & @CRLF
				$sText &= StringRegExpReplace($aSourse[$i], '(?s).*?\Q>\E(Модель.*?)\Q<\E.*', '\1') & @CRLF
				$sText &= StringRegExpReplace($aSourse[$i], '(?s).*?\Q>\E(Производитель.*?)\Q<\E.*', '\1') & @CRLF
				$sText &= StringRegExpReplace($aSourse[$i], '(?s).*?\Q>\E(Вес.*?)\Q<\E.*', '\1') & @CRLF
				$sText &= StringRegExpReplace($aSourse[$i], '(?s).*?\Q>\E(Цена.*?)\Q<\E.*', '\1') & @CRLF
				$sText &= StringRegExpReplace($aSourse[$i], '(?s).*?\Q>\E(Дата добавления.*?)\Q<\E.*', '\1') & @CRLF
				$sText &= 'Подробнее: ' & StringRegExpReplace($aSourse[$i], '(?s).*?(http://abc.kharkov.ua/.*?)\Q">\E.*', '\1') & @CRLF & _
						'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' & @CRLF
			Next
			$sText = StringRegExpReplace($sText, '<.*?>', ' ')
			$sText = StringReplace($sText, '<br', '')
			$sText = StringReplace($sText, 'amp;', '')
			FileWrite($hFile, $sText)
			$sText = '##########' & @CRLF
		EndIf
	EndIf
Next
FileClose($hFile)
TrayTip('Товары', 'Работа закончена' & @CRLF & 'Количество записей: ' & $z & @CRLF & _
		'Затрачено времени: ' & Round(TimerDiff($Time) / 1000, 2) & ' сек.', 5, 1)
Sleep(5000)
Exit
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
Хорошее решение :ok:
Только немного не то, видимо шаблон для определения заголовка (в StringRegExpReplace) всё же не тот! :(
Посмотрите в файле Товары.txt десятую позицию по товару.
Там содержимое заголовка выглядит так:
[box]Название: Компьютер Amator 1 Pentium Dual Core E2160 1.80GHz [/box]
А должно получится вот так:
[box]Название: Компьютер Amator 1 Pentium Dual Core E2160 1.80GHz MB ESC RC415ST-PM (Rio 3), Socket LGA775 ATX 1GB DIMM DDR2 360,0Gb (8Mb SATA II) SVGA int. ATI Radeon Xpress 200M DVD?RW SB ALC880 6ch LAN KB MS <[/box]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett [?]
А должно получится вот так:
Поправил, вроде работает (у меня). :whistle:
И, если без ссылок, то у меня так работает:
Код:
#include <File.au3>
#include <IE.au3>

$j = 0
Dim $aResult[$j + 1]
$oIE = _IECreate('http://abc.kharkov.ua/catalog/index.php?main_page=products_all&disp_order=1&page=1')
$oTable = _IETableGetCollection($oIE, 57)
$aTableArray = _IETableWriteToArray($oTable)
_IEQuit($oIE)
For $i = 1 To UBound($aTableArray, 2) - 2
	If $aTableArray[1][$i] And $aTableArray[0][$i + 1] Then
		$j += 1
		ReDim $aResult[$j + 1]
		$aResult[$j] = StringStripCR($aTableArray[1][$i]) & @CRLF & _
				StringReplace(StringStripCR($aTableArray[0][$i + 1]), '... подробнее', '') & _
				@CRLF & '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' & @CRLF & @CRLF
	EndIf
Next
$aResult[0] = 'Всего записей: ' & $j & '.' & @CRLF & _
		'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' & @CRLF & @CRLF
_FileWriteFromArray('Товары.txt', $aResult)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
madmasles сказал(а):
Увы :(
Вот результат по десятой позиции:
"Компьютер Amator 1" Pentium Dual Core E2160 1.80GHz / MB ESC RC415ST-PM (Rio 3), Socket LGA775 / ATX / 1GB DIMM DDR2 / 360,0Gb (8Mb SATA II) / SVGA
Отсутствует окончание заголовка:
int. ATI Radeon Xpress 200M DVD?RW SB ALC880 6ch LAN KB MS <

IMHO перед RegExp`ом строку нужно привести к единому формату, то есть заменить все символы Chr(10) и Chr(13) на Chr(32):
Код:
StringReplace(StringStripWS($String, 4), @CR, Chr(32))
 
Автор
Lucky_spirit

Lucky_spirit

Люблю играть на гитаре! :)
Сообщения
2
Репутация
0
Спасибо всем за помощь! :IL_AutoIt_1:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett,
Последний раз поправил, все равно в 5 позиции остается лишний :Censored: пробел (вместо 100 - 10 0). Ну и пусть остается. :whistle:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
От Розарио Агро еще никто не Уходил!
;D
Код:
#include <IE.au3>

$oIE = _IECreate ()

_Save_Product_In_TXT($oIE, 1)

Func _Save_Product_In_TXT($Object, $iPage)
    Local $sPrint = "", _ 
          $sPattern = "(.*?)(Модель.*?)(Производитель.*?)(Цена.*?)(Вес.*?)(Дата добавления.*?)$"
          
    $sURL = "http://abc.kharkov.ua/catalog/index.php?main_page=products_all&disp_order=1&page=" & $iPage
    _IENavigate($Object, $sURL)
          
    $oTDs = _IETagNameGetCollection($Object,"td")
    If Not @error Then
        For $oTD In $oTDs
            If  $oTD.getAttribute('valign') == "top" And _
                $oTD.className == "main" And _
                $oTD.getAttribute('colspan') == 2 Then
                $oLink = _IETagNameGetCollection($oTD, "a", 0)
                $sData = StringReplace(StringStripWS(_IEPropertyGet($oTD,"innerText"), 4), @CR, Chr(32))
                $aData = StringRegExp($sData, $sPattern, 2)
                For $i=1 To UBound($aData)-1
                    $sPrint &= $aData[$i] & @CRLF
                Next
                $sPrint &= "Подробнее: " & $oLink.href & @CRLF
                $sPrint &= @CRLF
            EndIf    
        Next
    EndIf
                
    $hFile = FileOpen(@ScriptDir & "\product_page_" & $iPage & ".txt", 129)
    FileWrite($hFile, $sPrint)
    FileClose($hFile)

EndFunc
 
Верх