Что нового

Как найти нужную строку в html

eropov

Jury
Сообщения
195
Репутация
25
Добрый вечер.
У меня появилась проблема с поиском нужной строки в html тексте. Html приходит после отправки запроса на сервер. Вот то, что приходит:
Код:
dae
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Copyright (c) Art. Lebedev Studio | http://www.artlebedev.ru/ -->

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Отправка SMS</title>
    <link rel="icon" href="/favicon.ico" type="image/x-icon" />
    <link rel="stylesheet" type="text/css" media="all" href="/f/1/global/css/main.css" />
    <script type="text/javascript" src="/f/1/global/js/jquery.js"></script>
    <script type="text/javascript" src="/f/1/global/js/jquery.color.js"></script>
    <script type="text/javascript" src="/f/1/global/js/main.js"></script>
    <script type="text/javascript" src="/f/1/global/js/swfobject.js"></script>
  </head>
  <body>
    <div id="layout">
      <div id="header">
        <div id="header_gradient">
          <img alt="" width="1000" height="25" src="/f/1/global/header_gradient.png" />
        </div>
        <div id="system_navigation">
          <div id="breadcrumbs">
            <ul>
              <li>
                <a href="/">Байкалвестком</a>
              </li>
              <li class="delimiter current">/</li>
              <li class="current">Отправка SMS</li>
            </ul>
          </div>
          <div id="system_icons">
            <b title="Отправить SMS" class="selected">
              <span class="sms"></span>
            </b>
            <a title="Ваш счет" href="/reference/pay/">
              <span class="balance"></span>
            </a>
            <a title="Карта покрытия" href="/gsm/coverage/">
              <span class="reciever"></span>
            </a>
          </div>
          <div class="clear"></div>
        </div>
        <div class="inclose">
          <div id="logo">
	<a href="/" class="selected"><img alt="Байкалвестком" width="461" height="100" src="/f/1/global/logo.png" /></a>
</div>
          <div id="navigation_parent" style="font-size:2.7em"></div>
          <div class="clear"></div>
          <div id="main_navigation">
            <ul class="navigation">
              <li>
                <a href="/gsm/">GSM 900/1800</a>
              </li>
              <li>
                <a href="/cdma/">CDMA 2000 1x</a>
              </li>
              <li>
                <a href="/reference/">Информация для абонента</a>
              </li>
              <li>
                <a href="http://issa.bwc.ru/">ИССА</a>
              </li>
              <li>
                <a href="/corp/">Корпоративным клиентам</a>
              </li>
              <li>
              </li>
              <li class="first">
                <a class="special" href="/about/">О компании</a>
              </li>
              <li>
                <a class="special" href="/news/">Новости</a>
              </li>
              <li>
                <a class="special" href="/careers/">Вакансии</a>
              </li>
              <li>
                <a class="special" href="/contact/">Обратная связь</a>
              </li>
            </ul>
            <div class="clear"></div>
            <div class="secondary">
            </div>
          </div>
          <div class="clear"></div>
        </di
5bc
v>
      </div>
      <div id="page_body">
        <div class="inclose">
          <div class="content_inclose">
            <div id="content">
              <h1 style="font-size:3.46666666666667em">Отправка SMS</h1>
<a style="font-size:1.0em;color:#c9891c;" href="/cgi-bin/mmssend.cgi">Отправка MMS</a>




<font size="+1"><font color="red"><b>Код с картинки не соответствует указаному числу.
</b></font></font>

<a href="/cgi-bin/smssend.cgi">Вернуться на страницу по отправке SMS.
</a>



            </div>
            <div id="content_right"><div class="thirdly"><ul class="navigation"><li></li></ul></div>

	

	
	
	
		</div>
            <div class="clear"></div>
          </div>
        </div>
      </div>
      <div id="footer">
        <div id="copyright">
          <p>© 2000-2008 <a href="/" class="selected">Байкалвестком</a></p>
        </div>
        <div id="search">
          <!--search_form>
            <form method="GET" action="/search/results/">
	<input type="search" id="search_field" name="text" placeholder="поиск" />
	<input type="submit" id="search_submit" value="Найти" />
</form>
          </search_form-->
              <a href="/search/" class="selected">Карта сайта</a>
        </div>
      </div>
    </div>
  </body>
</html>

0
Как из этого текста найти строки:
Код:
<font color="red"><b>Код с картинки не соответствует указаному числу.</b></font>
<font color="green"><b>Сообщение отправлено.</b></font>
Эти строки находятся на одном и том же месте, относительно выше описанного html, но при разных исходах.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
eropov,
Попробуйте так.
Код:
$sText = FileRead(@ScriptDir & '\1.txt')
$sSearch = StringRegExpReplace($sText, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')
MsgBox(64, @extended, $sSearch)
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
madmasles ваш код хорошо работает в том виде в котором он показан, но не работает у меня.
Возможно ошибка с получением html с сервера. Вот код:
Код:
#include <Array.au3>
#include <File.au3>
#include <Process.au3>

Dim $sArray[1]
Dim $sDomain = 'www.bwc.ru' ;домен или ip-адрес
Dim $iPort = 80 ;порт
Dim $phone_type = '950'
Dim $phone_number = '1342513'
Dim $communication = 'Привет'

For $i = 0 To 5
	If $i = 5 Then
		MsgBox(16, "Ошибка соединения", "Ошибка соединения с сервером")
		Exit
	EndIf
	;Запрос, который будет отправлен серверу
	$sRequest = 'GET /cgi-bin/smssend.cgi HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
	$sRequest &= 'Host: www.bwc.ru' & @CRLF
	$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' & @CRLF
	$sRequest &= 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF
	$sRequest &= 'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF
	$sRequest &= 'Accept-Encoding: gzip, deflate' & @CRLF
	$sRequest &= 'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7' & @CRLF
	$sRequest &= 'Keep-Alive: 115' & @CRLF
	$sRequest &= 'Connection: keep-alive' & @CRLF & @CRLF

	If TCPStartup() = 0 Then ContinueLoop 1
	$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес
	If @error Then ContinueLoop 1
	$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером
	If @error Then ContinueLoop 1
	TCPSend($iSocket, $sRequest) ;отправляем сообщение
	If @error Then ContinueLoop 1
	$sData = ''
	$sBuffer = ''
	$iTimer = TimerInit() ;запускаем таймер
	Do
		$sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
		$iError = @error
		If Not $sBuffer = '' Then ;если удалось получить сообщение
			$sData &= $sBuffer ;сохраняем полученное сообщение
			$iTimer = TimerInit() ;обнуляем таймер
		EndIf
	Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла

	TCPCloseSocket($iSocket)
	TCPShutdown()
	MsgBox(1, '1', '')
	For $j = 0 To 5
		If $j = 5 Then
			MsgBox(16, "Ошибка соединения", "Ошибка соединения с сервером")
			Exit
		EndIf
		$sUrl = StringRegExpReplace($sData, '(?s).*?id="code_img.*?src="(.*?)"\s?/>.*', 'http://bwc.ru/cgi-bin/$1')
		$issUrl = IsString($sUrl)
		If Not ($issUrl = 0) Then
			$size = InetGet($sUrl, @ScriptDir & "\CAP\1.png", 1)
			MsgBox(1, $issUrl & @TAB & $size, $sUrl)
			If $size = 0 Then
				;MsgBox(1, 'Картинка пуста', $size)
				_RunDOS("Ipconfig  /flushdns")
				FileDelete(@ScriptDir & "\CAP\1.png")
				ContinueLoop 2
			Else
				$RunDOS = _RunDOS(@ScriptDir & "\Cap\Cap.exe /recognize /ini CapLettersBWC.ini")
				_FileReadToArray(@ScriptDir & "\Cap\1.txt", $sArray)
				$sStr = $sArray[1]
				$sscode = StringLen($sStr)
				;If $sscode <= 4 Then
				ExitLoop 2
			EndIf
		ElseIf $issUrl = 0 Then
			ContinueLoop 2
		EndIf
	Next
Next
MsgBox(1, '2', '')
For $i = 0 To 5
	If $i = 5 Then
		MsgBox(16, "Ошибка отправки сообщения", "Ошибка отправки сообщения на сервер")
		Exit
	EndIf
	If (IsString($phone_type)) = 1 And (IsString($phone_number)) = 1 And (IsString($communication)) = 1 And _
			(StringLen($phone_type)) = 3 And (StringLen($phone_number)) = 7 And (StringLen($communication)) < 161 Then
		$scode = $sArray[1]
		$sid = StringRight($sUrl, 32)
		$post = 'phone_type=' & $phone_type & '&phone_number=' & $phone_number & '&communication=' & $communication & '&defhours=' & (@HOUR - 1) & '&defmin=' & @MIN & '&defdate=' & @MDAY & '.' & (@MON - 1) & '.' & @YEAR & '&code=' & $scode & '&sid=' & $sid
		$ContentLength = StringLen($post)
		$ContentLength = 'Content-Length: ' & $ContentLength
	Else
		MsgBox(16, "Ошибка введенных данных", "Недопустимое значение заполненных полей")
		Exit
	EndIf

	If StringLen($scode) = 4 Then
		$sRequest = ''
		$sRequest = 'POST /cgi-bin/smssend.cgi HTTP/1.1' & @CRLF
		$sRequest &= 'Host: www.bwc.ru' & @CRLF
		$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' & @CRLF
		$sRequest &= 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF
		$sRequest &= 'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF
		$sRequest &= 'Accept-Encoding: gzip, deflate' & @CRLF
		$sRequest &= 'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7' & @CRLF
		$sRequest &= 'Keep-Alive: 115' & @CRLF
		$sRequest &= 'Connection: keep-alive' & @CRLF
		$sRequest &= 'Referer: http://www.bwc.ru/cgi-bin/smssend.cgi' & @CRLF
		$sRequest &= 'Content-Type: application/x-www-form-urlencoded' & @CRLF
		$sRequest &= $ContentLength & @CRLF & @CRLF
		$sRequest &= $post

		If TCPStartup() = 0 Then ContinueLoop 1
		$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес
		If @error Then ContinueLoop 1
		$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером
		If @error Then ContinueLoop 1
		TCPSend($iSocket, $sRequest) ;отправляем сообщение
		If @error Then ContinueLoop 1
		$sData = ''
		$sBuffer = ''
		$iTimer = TimerInit() ;запускаем таймер
		Do
			$sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
			$iError = @error
			If Not $sBuffer = '' Then ;если удалось получить сообщение
				$sData &= $sBuffer ;сохраняем полученное сообщение
				$iTimer = TimerInit() ;обнуляем таймер
			EndIf
		Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла

		TCPCloseSocket($iSocket)
		TCPShutdown()

		$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3)
		$sSearch = StringRegExpReplace($aData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')

		MsgBox(1, '$aData', IsArray($aData))
		MsgBox(1, '$aSearch', IsArray($sSearch))
		MsgBox(1, '$nData', IsNumber($aData))
		MsgBox(1, '$nSearch', IsNumber($sSearch))
		MsgBox(1, '$sData', IsString($aData))
		MsgBox(1, '$sSearch', IsString($sSearch))

		;MsgBox(64, $aData, $sSearch)
		;_ArrayDisplay($aData,'$aData')
		;_ArrayDisplay($sSearch,'$sSearch')
		If (IsNumber($aData)) = 1 And (IsString($sSearch)) = 1 Then
			MsgBox(64, 'Отправка смс закончена успешно!', 'Сообщение отправлено!')
			$sSearch = StringRegExpReplace($aData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')
			Assign('sSearch', $sSearch)
			MsgBox(64, 'Отправка смс закончена успешно!', $sSearch)
			$FileOpen = FileOpen(@ScriptDir &"\Текстовый документ.txt", 1)
			FileWrite($FileOpen, $aData)
			FileWrite($FileOpen, $sSearch)
			FileClose(@ScriptDir &"\Текстовый документ.txt")
		ElseIf (IsArray($aData)) = 1 And (IsString($sSearch)) = 1 Then
			MsgBox(16, 'Ошибка при отправке смс', 'Код с картинки не соответствует указаному числу.')
			$sSearch = StringRegExpReplace($aData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')
			;Assign('sSearch', $sSearch)
			MsgBox(16, 'Ошибка при отправке смс', $sSearch)
			$FileOpen = FileOpen(@ScriptDir & "\Текстовый документ.txt", 1)
			FileWrite($FileOpen, $aData)
			FileWrite($FileOpen, $sSearch)
			FileClose(@ScriptDir & "\Текстовый документ.txt")
		Else
			MsgBox(1, '', 'не понятно')
		EndIf
		ExitLoop 1
	EndIf
Next
В конце скрипта есть две строчки
Код:
$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3)
$sSearch = StringRegExpReplace($aData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')
Тестировал долго и точно могу сказать что переменная с html $aData имеет два исхода, либо придет число 1, либо массив с html (текст приходит по разному т.е. в разной кодировке)
Как только не обдумывал реализацию извлечения строки, не как не получается(какие нужны строки описано в начале темы, но лучше все(если не ошибаюсь их 4))
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Что это ?
Код:
$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3)
$sSearch = StringRegExpReplace($aData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')


$aData - это массив.
Как можно выполнять с массивом :?
Код:
$sSearch = StringRegExpReplace($aData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')


Возможно надо :
Код:
$sSearch = StringRegExpReplace($sData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')


т.е. использовать тот $sData , из которого получен массив.
или смотри сам массив и используй его элементы : $aData[0], $aData[1] и т.д. (но не весь же массив $aData)
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Код:
$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3); выдергивает html, отбрасывает заголовки(header)
возвращает всегда по разному то число 1, то массив(массив приходит с двумя элементами, первый заголовки , второй html)

Код:
$sSearch = StringRegExpReplace($sData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')

Я как только не пробовал , это не годится
Вот полные исходники
http://zalil.ru/32136282
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
eropov [?]
Я как только не пробовал , это не годится
А что нельзя перед получением массива $aData посмотреть,что из себя представляет сам текст $sData ?

Кстати если поставить сразу после получения массива $aData
Код:
MsgBox ( 0, @Error,@Extended )

получишь ответы на некоторые свои вопросы (заглянув конечно в справку для ф-ии StringRegExp по поводу значений @Error и @Extended )

Что пытаться сразу получить готовый рез-тат при явно неработающем скрипте.
Надо расставить в контрольных точках ConsoleWrite и проверять то ли получаем или нет. И Выявить на каком этапе появляется ошибка.




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

И еще можно попробовать :
Код:
;................
MsgBox ( 0,"$sData", $sData )
$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3);
If @error Then ContinueLoop
MsgBox ( 0,"$sData[1] ", $sData[1] ); Посмотреть есть ли в тексте то,что ты ищешь
$sSearch = StringRegExpReplace($sData[1], '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Спасибо gregaz, протестил раз 10, пока все работает.
Немного модефицировал:
Код:
$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3)
If @error Then ContinueLoop
$sSearch = StringRegExpReplace($sData, '(?si).*<font color=.*?<b>(.*?)\r?\n?</b></font>.*', '$1')
$sSearch = BinaryToString(Binary($sSearch), 4);кодировка текста не правильно распазнается, по этому пришлось немного "профильтровать"
MsgBox(64, "То что надо", $sSearch)
ExitLoop 1
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
eropov,
А зачем Вам заголовок убирать? ИМХО, лишняя операция.
 
Верх