Что нового

StringRegExp Найти и сравнить число

Lum

Новичок
Сообщения
61
Репутация
3
Новая задачка всплыла у меня :shok: Прям чем дальше, тем страшнее...

Собственно требуется, скажем так, вычленить цифру из текста и сравнить ее с образцом. Приведу кусочек кода страницы и своего кода. Кто что посоветует?

Код:
<TABLE class=tabl_1 cellSpacing=0 cellPadding=0><TBODY>
<TR class=veg_png_td>
<TD class=nav_td_txt noWrap>Текст текст: 21%
Текст: 3
Время: <SPAN id=time_fly0>00:18:48</SPAN>
Текст: <SPAN id=oscol_perc0>35</SPAN>%</TD>

<INPUT id=m_num value=0 type=hidden name=m_num> <INPUT class=veg_f_off onmouseover="this.className='veg_f_on'" onmouseout="this.className='veg_f_off'"

Сразу оговорюсь, что в дальнейшем будут 2 <TD class=nav_td_txt noWrap> и тд., где будут разными только цифры и 2 кнопки...
Помогите пожалуйста хотя бы при наличии одной разобраться :smile:

Код:
$oIE = _IECreate("http://собсно страничка на которой все это безобразие")

	; Переменные для логических вычислений
	Global $x1

	; если "Слово слово: 0", то нажать "Ссылка"
	If StringRegExp('(?s).*?veg_chush_txt>Слово слово: 0 </P>?.*', "\1") Then
		_IELinkClickByText($oIE, "Ссылка")
	; если "Слово слово: 1", то проверить значения
	ElseIf StringRegExp('(?s).*?veg_skupalka_txt>Слово слово: 1 </P>?.*', "\1") Then
		$oTable = _IETableGetCollection($oIE)
		$oTR = _IETagNameGetCollection($oTABLE, "tr")
		$oTD = _IETagNameGetCollection($oTR, "td")
		If $oTD.class="nav_td_txt" Then
			
$x1 = StringSplit($oTD.innertext,'Текст\ текст\:\?\%') ; вот тут загвоздка "Текст текст: цифра%"; для сравнения нужна эта самая цифра, она имеет свойство меняться
			
If $x1>50 Then
				$oInputs = _IETagNameGetCollection($oIE, "input")
				For $oInput In $oInputs
					If $oInput.type="submit" And $oInput.name="veg_f_off" Then
						_IEAction($oInput, "click")
					Else
					_IELinkClickByText($oIE, "Ссылка")
					EndIf
				Next
			EndIf
		EndIf
	EndIf
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Нужна помощь в освоении функции StringSplit

Lum [?]
; вот тут загвоздка "Текст текст: цифра%"; для сравнения нужна эта самая цифра, она имеет свойство меняться
Зачем нужен StringSplit ?
Код:
$x1 = StringRegExpReplace ( $oTD.innertext, "\D+", "" ) ; Получение цифры (Удаляются из строки все нецифры)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Нужна помощь в освоении функции StringSplit

Я бы сделал так :
Код:
#include <IE.au3>
$oIE = _IECreate("http://собсно страничка на которой все это безобразие")
$oElements =_IETagNameGetCollection ($oIE,'TD')
$iNumber=21 ; Номер для поиска
For $oElement In $oElements
	$sLine=$oElement.innerhtml; Находим строки с тегом 'TD'
	$sFragment =StringRegExpReplace ($sLine,"
.*","") ; Находим нужный фрагмент в строке (от начала строки до  
)
	If Not @extended Then ContinueLoop
	$iNumberInFragment=StringRegExpReplace ($sFragment,"\D+?",""); Удаляем из найденного фрагмента все нецифры
	If Not @extended Then ContinueLoop
	If $iNumberInFragment=$iNumber  Then ;  Проверяем совпадение цифр  
		MsgBox(0,'$sFragment',$sFragment) ; Фрагмент ,  содержащий заданную цифру
		; Здесь могут быть любые операции с найденным фрагментом : $sFragment
	EndIf
Next



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

Или вообще без цикла так :
Код:
#include <IE.au3>
$oIE = _IECreate("http://собсно страничка на которой все это безобразие")
$sTextHTML=_IEDocReadHTML ( $oIE)
$iNumber=21 ; Номер для поиска
$sFragment =StringRegExpReplace ($sTextHTML,"(?si).*Wrap>(\D*?" & $iNumber & "\D*?)
.*","\1") ; Находим нужный фрагмент в тексте
 
Автор
L

Lum

Новичок
Сообщения
61
Репутация
3
Re: Нужна помощь в освоении функции StringSplit

gregaz, спасибо огроменное))) Работает на УРА! Надеюсь, что тоже когда-нибудь смогу разобраться в этих функциях по-человечески)
Использовала последний фрагмент) Чем проще, тем надежнее) :beer:
 
Автор
L

Lum

Новичок
Сообщения
61
Репутация
3
Re: Нужна помощь в освоении функции StringSplit

Что-то не так...
Все работает, кроме одной строки...

Код:
$oIE = _IECreate("http://")

        $sTextHTML=_IEDocReadHTML($oIE)
		; если найдено 0
		If StringRegExp($sTextHTML, '(?s).*?Слово слово: 0 </P>?.*', "\1") Then
			MsgBox(4096, "Test", "0", 10)

		; если найден 1
		ElseIf StringRegExp($sTextHTML, '(?s).*?Слово слово: 1 </P>?.*', "\1") Then
			$x1 = StringRegExp($sTextHTML, '(?s).*?Процент, который нужно сравнить:\s\d?', "\D?", "\1") ; эта строчка и есть проблемная((
			    If $x1>=50 Then
					$oInputs = _IETagNameGetCollection($oIE, "input")
					For $oInput In $oInputs
						If $oInput.type="submit" And $oInput.name="veg_f_off" Then
							_IEAction($oInput, "click")
						EndIf
					Next
				Else
				MsgBox(4096, "Test", "1", 10)
			    EndIf

		; если найдено 2
		ElseIf StringRegExp($sTextHTML, '(?s).*?Слово слово: 2 </P>?.*', "\1") Then
			MsgBox(4096, "Test", "2", 10)


Код проблемной строчки в браузере
Код:
 noWrap>Процент, который нужно сравнить: 50%

Дело в том, что вместо 50 может быть и 30 и 1 и 100 и т.д.
Программа должна определять это число и если оно больше либо равно 50 нажимать на кнопку (input), если меньше 50, то выводить сообщение.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Lum [?]
Дело в том, что вместо 50 может быть и 30 и 1 и 100 и т.д.
Программа должна определять это число и если оно больше либо равно 50 нажимать на кнопку (input), если меньше 50, то выводить сообщение.

Так:
Код:
#include <IE.au3>
$oIE = _IECreate(@ScriptDir &"\1.htm")
$sTextHTML=_IEDocReadHTML ( $oIE)
$iNumber=50 ; Номер для поиска
$sFragment =StringRegExpReplace ($sTextHTML,"(?si).*Wrap>(.*?)
.*","\1") ; Находим нужный фрагмент в тексте
If Not @extended Then Exit
$x1 = StringRegExpReplace ($sFragment,"\D+?",""); Удаляем из найденного фрагмента все нецифры
If $x1 >= $iNumber Then 
	MsgBox(4096, $iNumber,"Текст фрагмента  = " & $sFragment,1)  
           ;............................................            
Else	
	MsgBox(4096, $x1,"Номер в фрагменте меньше " & $iNumber)
EndIf



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

Мне непонятно :
Будет просмотр нескольких страниц ?
или все это про поиск на 1 странице ?
(Количество возможных строк с нужными тегами на странице )


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

Если надо перебрать несколько HTML страниц и наити страницу с необходимым номером в строке , то подойдет пример ,показанный выше
Если же поиск ведется на одной странице и есть несколько таких строк и тегов "input" . то подход должен быть несколько иной
 
Автор
L

Lum

Новичок
Сообщения
61
Репутация
3
Эх, на одной все странице :( Относительно тегов:
Если найдено 1, то это вот так выглядит:
Код:
<TD class=nav_td_txt noWrap>Процент: 49%
Количество: 3
Время: <SPAN id=time_fl0>00:19:45</SPAN>
Еще один процент: <SPAN id=oscol_p0>42</SPAN>%</TD>

<INPUT id=me_num value=0 type=hidden name=me_num><INPUT class=veg_f_off onmouseover="this.className='veg_f_on'" onmouseout="this.className='veg_f_off'" type=submit>
Если 2, то
Код:
<TD class=nav_td_txt noWrap>Процент: 20%
Количество: 1
Время: <SPAN id=time_fl0>00:11:35</SPAN>
Еще один процент: <SPAN id=oscol_p0>11</SPAN>%</TD>

<INPUT id=me_num value=0 type=hidden name=me_num> <INPUT class=veg_f_off onmouseover="this.className='veg_f_on'" onmouseout="this.className='veg_f_off'" type=submit> 

<TD class=nav_td_txt noWrap>Процент: 16%
Количество: 2
Время: <SPAN id=time_fl1>00:16:01</SPAN>
Еще один процент: <SPAN id=oscol_p1>31</SPAN>%</TD>
 
<INPUT id=me_num value=1 type=hidden name=me_num> <INPUT class=veg_f_off onmouseover="this.className='veg_f_on'" onmouseout="this.className='veg_f_off'" type=submit>
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Lum [?]
Если найдено 1, то это вот так выглядит:
а вносить данные надо (или кликать по кнопкам ) во все найденные Input"ы или в какой-то конкретный ?
 
Автор
L

Lum

Новичок
Сообщения
61
Репутация
3
На кнопки можешь сильно не отвлекаться) Там я найду как решить куда кликать) Нужно на конкретную нажать. Но прежде чем нажать нужно найти число, сравнить число, выбрать большее, а уже потом разбираться куда нажимать)

Смотри, там нужно: Нашел фразу от "Процент: х%
", а затем приравнял х к Number. Но как это сделать до меня не доходит, все остальное в порядке.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Еще раз чуть подробнее :
Надо найти фразу с наибльшим числом ?
 
Автор
L

Lum

Новичок
Сообщения
61
Репутация
3
надо просто найти фразу с числом, а потом это число сравнить, например с 50. Если число больше или равно 50, то выполнить одно действи, если меньше 50, то другое.
 

Лоу

Новичок
Сообщения
4
Репутация
0
есть число полей 1 до n и соответственно 1-n кнопок по числу полей, надо взять инфу из полей,сравнить между собой запомнив их порядковые номера и когда найдешь больший - клик на кнопку относящуюся к этому полю, я правильно описал задачу?)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Lum [?]
надо просто найти фразу с числом, а потом это число сравнить, например с 50. Если число больше или равно 50, то выполнить одно действи, если меньше 50, то другое.
Так :
Код:
#include <IE.au3>
$oIE = _IECreate(@ScriptDir &"\2.htm")
$oElements =_IETagNameGetCollection ($oIE,'TD')
$iNumber=50 ; Номер для поиска
For $oElement In $oElements
    $sLine=$oElement.innerhtml; Находим строки с тегом 'TD'
    $sFragment =StringRegExpReplace ($sLine,"
.*","") ; Находим нужный фрагмент в строке (от начала строки до  
)
    If Not @extended Then ContinueLoop
    $iNumberInFragment=StringRegExpReplace ($sFragment,"\D+?",""); Удаляем из найденного фрагмента все нецифры
    If Not @extended Then ContinueLoop
    If $iNumberInFragment >=$iNumber Then
		MsgBox(4096, $iNumberInFragment,"Номер в фрагменте  = " & $iNumberInFragment,1)
		;.........................
	Else	
		MsgBox(4096, $iNumberInFragment,"Номер в фрагменте меньше " & $iNumber,1)
	EndIf
Next



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

Если надо находить Max ,то :
Код:
#include <IE.au3>
$oIE = _IECreate(@ScriptDir &"\2.htm")
$oElements =_IETagNameGetCollection ($oIE,'TD')
dim $iMaxNumber=0
For $oElement In $oElements
    $sLine=$oElement.innerhtml; Находим строки с тегом 'TD'
    $sFragment =StringRegExpReplace ($sLine,"
.*","") ; Находим нужный фрагмент в строке (от начала строки до  
)
    If Not @extended Then ContinueLoop
    $iNumberInFragment=StringRegExpReplace ($sFragment,"\D+?",""); Удаляем из найденного фрагмента все нецифры
    If Not @extended Then ContinueLoop
    If $iNumberInFragment < $iMaxNumber  Then ContinueLoop
	$iMaxNumber=$iNumberInFragment  
	$sLineMax=$sLine
Next
MsgBox(0,$iMaxNumber,'$sLineMax= ' & $sLineMax)
 
Автор
L

Lum

Новичок
Сообщения
61
Репутация
3
Блииииннн, прошу прощения. Это я не догоняла, что $iNumber=50 ; Номер для поиска это и есть число с которым сравнивают, вс работает) Спасибо огромное)
 
Верх