Что нового

Ошибка в массиве $aArray^ ERROR

SeMgA

Новичок
Сообщения
47
Репутация
0
Добрый день, искал на форуме ответ - не нашел помогите пожалуйста разобраться
Есть код с просторов интернета, взял его за основу
Код:
AutoIt

#include <IE.au3>
Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1)
Sleep(2000)
Local $oDiv = _IEGetObjById($oIE, "categories-3")
Local $oLis = _IETagNameGetCollection($oDiv, "li")
For $oLi In $oLis
 If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  Local $aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',1)
  Global $Num=$aArray[0]
 EndIf
next
MsgBox(0,"",$Num);
_IEQuit($oIE)



Код для парсинга информации с сайта
он выдает такую ошибку

Код:
"D:\autoit\test.au3" (65) : ==> Subscript used on non-accessible variable.:
Global $Num= $aArray[0]
Global $Num= $aArray^ ERROR
>Exit code: 1    Time: 5.462
Посоветуйте что - нибудь пожалуйста, не знаю как быть.
 

axsmak

Знающий
Сообщения
32
Репутация
7
Добавьте немного отладочной информации и покажите вывод
Код:
For $oLi In $oLis
 If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  ConsoleWrite($oLiHtml & @CRLF)
  Local $aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',1)
  If @error Then ConsoleWrite(@error & "/" & @extended  & @CRLF)
  Global $Num=$aArray[0]
 EndIf
Next
 
Автор
S

SeMgA

Новичок
Сообщения
47
Репутация
0
Если я Вас правильно понял

Код:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\autoit\test.au3"    
<li class="widget widget_categories" id="categories-5"><p class="wtitle">ѳⱨ먼/p>		<ul>
	<li class="cat-item cat-item-9"><a href="http://coolcode.ru/admin/">d�鲲????㡭饼/a>
</li>
	<li class="cat-item cat-item-362"><a href="http://coolcode.ru/mikrokontrolleryi/">ͨ뱮믭????즰????>
</li>
	<li class="cat-item cat-item-27"><a href="http://coolcode.ru/novosti/">ή㯱????a>
</li>
	<li class="cat-item cat-item-12"><a href="http://coolcode.ru/programming_languages/training/">ϡ????饼/a>
</li>
	<li class="cat-item cat-item-31"><a href="http://coolcode.ru/reshenie-zadach/">а????讠</a>
</li>
	<li class="cat-item cat-item-24"><a href="http://coolcode.ru/proektyi/">а寧????a>
</li>
	<li class="cat-item cat-item-6"><a href="http://coolcode.ru/admin/scripts/">Ҫ????????>
</li>
	<li class="cat-item cat-item-19"><a href="http://coolcode.ru/programming_languages/training/spravochnaya-informatsiya/">ү????�� 鮴ﱬᷨ��>
</li>
	<li class="cat-item cat-item-21"><a href="http://coolcode.ru/tsiklyi-statey/">ר묻 ????橮</a>
</li>
	<li class="cat-item cat-item-11"><a href="http://coolcode.ru/programming_languages/">ࠧ????౮䱠�????</a>
</li>
		</ul>
</li>"D:\autoit\test.au3" (63) : ==> Subscript used on non-accessible variable.:
Global $Num= $aArray[0]
Global $Num= $aArray^ ERROR
>Exit code: 1    Time: 9.503
 

axsmak

Знающий
Сообщения
32
Репутация
7
Не вижу вывода
Код:
If @error Then ConsoleWrite(@error & "/" & @extended  & @CRLF)
 
Автор
S

SeMgA

Новичок
Сообщения
47
Репутация
0
Если я добавляю Ваш код в "свой"
Код:
#include <IE.au3>
Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1)
Sleep(2000)
Local $oDiv = _IEGetObjById($oIE, "categories-3")
Local $oLis = _IETagNameGetCollection($oDiv, "li")
For $oLi In $oLis
 If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  Local $aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',1)
  If @error Then ConsoleWrite(@error & "/" & @extended  & @CRLF)
  Global $Num=$aArray[0]
 EndIf
next
MsgBox(0,"",$Num);
_IEQuit($oIE)


выходит вот - так

Код:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\autoit\test.au3"    
1/0
"D:\autoit\test.au3" (63) : ==> Subscript used on non-accessible variable.:
Global $Num= $aArray[0]
Global $Num= $aArray^ ERROR
>Exit code: 1    Time: 6.617
 

axsmak

Знающий
Сообщения
32
Репутация
7
[box title=Справка по StringRegExp]если flag = 1 или 2, то @error принимает следующие значения:
0 Возвращает массив. @extended содержит позицию, в которой закончился поиск, чтобы использовать для дальнейшего поиска.
1 Нет совпадений. Возвращаемое значение - не массив.
2 Неправильный шаблон, возвращаемое значение - не массив. @extended содержит позицию ошибочного символа в регулярном выражении.[/box]

У вас нет совпадений по шаблону. Проблема тут '\((.*?)\)'
К сожалению я не рублю в регулярках, но на первый взгляд вы не те слэши используете - в url используются другие '/((.*?)/)'
В гугле "тест регулярных выражений"
 
Автор
S

SeMgA

Новичок
Сообщения
47
Репутация
0
Увы не в этом ошибка, у меня есть такой код

Код:
$vTest = '<row orderID="234476834632310" charID="15223471013094"/>'
$orderID = StringRegExpReplace($sURL, '(?i).*orderID="(.*?)\" charID.*', '\1')
ConsoleWrite("Result: " & $orderID &  @LF)


Он работает, как бы не знаю что делать...
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Код:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\autoit\test.au3"    
1/0
"D:\autoit\test.au3" (63) : ==> Subscript used on non-accessible variable.:
Global $Num= $aArray[0]
Global $Num= $aArray^ ERROR
>Exit code: 1    Time: 6.617
$aArray[0] не принимает никакого значения. Добавьте перед регуляркой какое нибудь присвоение
Код:
Local $aArray[0] = 0
$aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',1)
 

axsmak

Знающий
Сообщения
32
Репутация
7
SeMgA сказал(а):
Увы не в этом ошибка, у меня есть такой код
Он работает, как бы не знаю что делать...
Не буду спорить насчет этого, но по существу вашей регулярки в теме просто покажу ваш и свой вариант в деле
 

Вложения

  • reg1.jpg
    reg1.jpg
    149.2 КБ · Просмотры: 14
Автор
S

SeMgA

Новичок
Сообщения
47
Репутация
0
axsmak сказал(а):
SeMgA сказал(а):
Увы не в этом ошибка, у меня есть такой код
Он работает, как бы не знаю что делать...
Не буду спорить насчет этого, но по существу вашей регулярки в теме просто покажу ваш и свой вариант в деле

Вы смотрите не тот код, программа вытаскивает исходный код страницы.


ildar сказал(а):
Код:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\autoit\test.au3"    
1/0
"D:\autoit\test.au3" (63) : ==> Subscript used on non-accessible variable.:
Global $Num= $aArray[0]
Global $Num= $aArray^ ERROR
>Exit code: 1    Time: 6.617
$aArray[0] не принимает никакого значения. Добавьте перед регуляркой какое нибудь присвоение
Код:
Local $aArray[0] = 0
$aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',1)
Спасибо Вам за ответ, только вот такая ошибка при Вашем коде)
Код:
Local $oIE = _IECreate("http://coolcode.ru/",0,0,1,1)
Sleep(500)
Local $oDiv = _IEGetObjById($oIE, "categories-5")
Local $oLis = _IETagNameGetCollection($oDiv, "li")
For $oLi In $oLis
 If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  Global $aArray[0] = 0
  Local $aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',1)
  Global $Num= $aArray[0]
 EndIf
next
MsgBox(0,"",$aArray[0]);
_IEQuit($oIE)



Код:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\autoit\test.au3"    
"D:\autoit\test.au3" (68) : ==> Subscript used on non-accessible variable.:
Global $Num= $aArray[0]
Global $Num= $aArray^ ERROR
>Exit code: 1    Time: 4.198
 

axsmak

Знающий
Сообщения
32
Репутация
7
Может вы скажите, что вы хотите получит в $Num? Так будет проще
Пока у меня работает, как я и писал, но непонятно, что нужно
Код:
#include <IE.au3>
#include <Array.au3>
Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1)
Sleep(2000)
Local $oDiv = _IEGetObjById($oIE, "categories-5")
Local $oLis = _IETagNameGetCollection($oDiv, "li")
For $oLi In $oLis
 If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  ConsoleWrite($oLiHtml & @CRLF)
  Local $aArray = StringRegExp($oLiHtml,'/((.*?)/)',3)
  If @error Then ConsoleWrite(@error & "/" & @extended  & @CRLF)
  _ArrayDisplay($aArray)
  Global $Num=$aArray[0]
 EndIf
next
MsgBox(0,"",$Num);
_IEQuit($oIE)
 
Автор
S

SeMgA

Новичок
Сообщения
47
Репутация
0
axsmak сказал(а):
Может вы скажите, что вы хотите получит в $Num? Так будет проще
Пока у меня работает, как я и писал, но непонятно, что нужно
Код:
#include <IE.au3>
#include <Array.au3>
Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1)
Sleep(2000)
Local $oDiv = _IEGetObjById($oIE, "categories-5")
Local $oLis = _IETagNameGetCollection($oDiv, "li")
For $oLi In $oLis
 If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  ConsoleWrite($oLiHtml & @CRLF)
  Local $aArray = StringRegExp($oLiHtml,'/((.*?)/)',3)
  If @error Then ConsoleWrite(@error & "/" & @extended  & @CRLF)
  _ArrayDisplay($aArray)
  Global $Num=$aArray[0]
 EndIf
next
MsgBox(0,"",$Num);
_IEQuit($oIE)
Мне нужно утащить с сайта кусочек кода, вернее ID
Например есть код на сайте

Код:
<row orderID="476834623241310" charID="1571123456013094"

Мне нужно вытянуть из этой части orderID
увы с парсингом в первый раз сталкиваюсь, отсюда сложности
Код который я выложил в начале темы - как пример, с него я собирался сделать код под свои нужды.
Спасибо за Ваш код, буду его перелопачивать!
 

axsmak

Знающий
Сообщения
32
Репутация
7
Ваша задача - добиться, чтобы в $oLiHtml попала строка с 'orderID="476834623241310" '
Активно использщуйте ConsoleWrite при отладке
Код:
#include <Array.au3>

Local $oLiHtml='<row orderID="476834623241310" charID="1571123456013094">'
ConsoleWrite($oLiHtml & @CRLF)
Local $aArray = StringRegExp($oLiHtml,'orderID="([0-9]*)"',1)
If @error Then ConsoleWrite(@error & "/" & @extended  & @CRLF)
Global $Num=$aArray[0]
ConsoleWrite($Num & @CRLF)

MsgBox(0,"",$Num);

Вывод:
Код:
>Running:(3.3.14.2):C:\Program Files (x86)\AutoIt3\autoit3.exe "E:\AutoIt\temp2.au3" -5   
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
<row orderID="476834623241310" charID="1571123456013094">
476834623241310
+>14:57:53 AutoIt3.exe ended.rc:0
+>14:57:53 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 2.098
 
Автор
S

SeMgA

Новичок
Сообщения
47
Репутация
0
axsmak сказал(а):
Ваша задача - добиться, чтобы в $oLiHtml попала строка с 'orderID="476834623241310" '
Активно использщуйте ConsoleWrite при отладке
Код:
#include <Array.au3>

Local $oLiHtml='<row orderID="476834623241310" charID="1571123456013094">'
ConsoleWrite($oLiHtml & @CRLF)
Local $aArray = StringRegExp($oLiHtml,'orderID="([0-9]*)"',1)
If @error Then ConsoleWrite(@error & "/" & @extended  & @CRLF)
Global $Num=$aArray[0]
ConsoleWrite($Num & @CRLF)

MsgBox(0,"",$Num);

Вывод:
Код:
>Running:(3.3.14.2):C:\Program Files (x86)\AutoIt3\autoit3.exe "E:\AutoIt\temp2.au3" -5   
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
<row orderID="476834623241310" charID="1571123456013094">
476834623241310
+>14:57:53 AutoIt3.exe ended.rc:0
+>14:57:53 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 2.098

спасибо, сейчас буду разбираться
 
A

Alofa

Гость
Минуточку господа, отвлекитесь от проблемы и присмотритесь к коду.
Это что такое?
Код:
Local $aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',1)
Global $Num= $aArray[0]

Это код, который писал плохой разработчик. Почему?
Да потому, что в своем скрипте нужно учиться предусматривать различные варианты развития событий и соответственно реагировать на них (осуществлять обработку ошибок). Здесь этого нет - в первой строке обязательно должен быть массив, потому что во второй мы уже обращаемся к одному из его элементов. Очень частая и грубая ошибка, а если массива не будет, то что? Правильно, будут рождаться подобные темы.
Почитайте НЕофициальный FAQ AutoIt и Полезные рекомендации по написанию скриптов.
 
Верх