Что нового

[Данные, строки] Найти вхождение в строке (html код)

Fever

Скриптер
Сообщения
308
Репутация
112
есть файл (пример) http://www.autoitscript.com/autoit3/files/beta/update.dat из справки
мне нужно найти в строке значение "version", и вывести то, что ему равно, тоесть 3.3.4.0
как ето сделать? :whistle:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Данные, строки] Найти в строке

Конкретно в этом файле:
Код:
$var = IniRead(@ScriptDir & "\update.dat", "AutoIt", "version", "NotFound")
MsgBox(4096, "Result", $var)


А если структура не ini - файла, то у меня так находит:
Код:
#include <file.au3>

Dim $aArray
_FileReadToArray(@ScriptDir & "\update.dat", $aArray)
For $i = 1 To UBound($aArray) - 1
	If StringInStr($aArray[$i], "version") > 0 Then
		$var = StringRegExpReplace($aArray[$i], "[^.0-9]", "\1")
		MsgBox(4096, "Result", $var)
	EndIf
Next
 
Автор
F

Fever

Скриптер
Сообщения
308
Репутация
112
Re: [Данные, строки] Найти в строке

а если html документ??? :wacko:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Данные, строки] Найти в строке

Fever [?]
а если html документ?
Не имеет разницы какой документ, если этот файл имеет структуру ini-файла, то Ini* функций для этого вполне подходят.
 
Автор
F

Fever

Скриптер
Сообщения
308
Репутация
112
Re: [Данные, строки] Найти в строке

Не имеет разницы какой документ, если этот файл имеет структуру ini-файла, то Ini* функций для этого вполне подходят.
в том то и проблема, ето обычный html код, конкретно

Юзеров на сайте: 20

нужно найти именно число 20 :wacko:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Данные, строки] Найти в строке

Fever
Я в свой ответ добавил еще вариант. А если
Fever [?]
...ето обычный html код...
то приведите пример куска кода.
 
Автор
F

Fever

Скриптер
Сообщения
308
Репутация
112
Re: [Данные, строки] Найти в строке

Я в свой ответ добавил еще вариант
у меня Ваш вариант не работает
то приведите пример куска кода.
<a href="memberlist.php?admin">Подробнее</a>-->

- <a href="memberlist.php">Топ-лист</a>

- <a href="memberlist.php?ban">Бан-лист</a> (2)
</tr></td>
<tr>
<td class="row1">Работаем с: <b>19 Июл, 13:26</b>

Тем: 717




Вложений: 414

Юзеров: 217

Последний: <a href="profile.php?mode=viewprofile&amp;u=221">Торч</a>

Выдано медалей: 2

В группах состоят: 43 человек
</tr></td>
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Fever
С этого и нужно было начинать.
И куски кода следует заключать в соответствующий тег.

Код:
$sString = ClipGet() ;тут строка html кода

$sResult = StringRegExpReplace($sString, '(?s).*<td class="row1">Работаем с: ((?-s).*?)[\r\n]+.*', '\1')
ConsoleWrite($sResult & @CRLF)



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

Кстати, для поиска в строке со структурой ini-файла, есть http://autoit-script.ru/index.php?topic=1083
 

Gealut

Новичок
Сообщения
38
Репутация
0
CreatoR сказал(а):
Код:
$sString = ClipGet() ;тут строка html кода

$sResult = StringRegExpReplace($sString, '(?s).*<td class="row1">Работаем с: ((?-s).*?)[\r\n]+.*', '\1')
ConsoleWrite($sResult & @CRLF)

Сорри, что-то никак у меня не получается использовать аналог этого регулярного выражения:

Код:
#include "IE.au3"

Dim $descript
$file = "D:\_WorkBase\Culinary2010\0\test.html"

$oIE = _IECreate($file, 1)
$str1 = _IEDocReadHTML($oIE)

$descript = StringRegExpReplace($str1, '(?s).*<(?i)span class="spec-value">((?-s).*?)</(?i)span>.*', '\1' )
MsgBox(0, "тест", $descript )


В html примерно в середине такой текст:

Код:
<div style="width: 88%">
	<h1 class="spec-name">

	Stock Photo:
	 <span class="spec-value">Flax seed full screen</span>
	</h1>
	


</div>
</center>

Нужно выдернуть текст между <span class="spec-value"> и </span>

Подскажите, что я неправильно делаю?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Gealut
Попробуй вот так:

Код:
; НАЧАЛО

$ADDR="D:\_WorkBase\Culinary2010\0\test.html"

$FILE=FileOpen($ADDR,0)

$TEXT=FileRead($FILE)

FileClose($FILE)

$descript  = StringRegExpReplace($TEXT, '(?s).*<(?i)span class="spec-value">((?-s).*?)</(?i)span>.*', '\1' )
MsgBox(0, "тест", $descript )

; КОНЕЦ


Само регулярное выражение срабатывает...
Наверное, не срабатывает конструкция IE для локальных файлов...
 

Gealut

Новичок
Сообщения
38
Репутация
0
snoitaleR сказал(а):
Само регулярное выражение срабатывает...
Наверное, не срабатывает конструкция IE для локальных файлов...

Спасибо, так работает, но мне это мало поможет, к сожалению. Локальный html через IE сделан только для теста регулярного выражения, чтобы не дергать постоянно тот сайт, откуда этот html. Потому что в итоговом скрипте в эксплорере открываются ссылки вида http://www.shutterstock.com/pic-1097173.html , а ссылки циклом считываются из текстового файла (их там много будет). Все остальное я уже написал, там нет проблем. Есть проблема только именно с парсингом получившегося html. Хочется именно через регулярные выражения сделать...

Брать html страницы, сохранять в файл и тут же читать его заново? Кривовато как-то... В конце концов так и сделаю, если другое решение не найдется.
 

Garrett

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

Dim $descript
$file = "D:\_WorkBase\Culinary2010\0\test.html"

$oIE = _IECreate($file)
$oInputs = _IETagNameGetCollection ($oIE, "span")
;~ ConsoleWrite(@extended)
For $oInput In $oInputs
	If $oInput.className = "spec-value" Then
		MsgBox(0, '<span class="' & $oInput.className & '">' & $oInput.innerText & '</span>', 'Текст: ' & $oInput.innerText )
	EndIf
Next



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

Ваша задача описывается достаточно просто:
Дано: _http://www.shutterstock.com/pic-1097173.html
Требуется: вытащит текст ‘Flax seed full screen’
Это позволит быстрее понять вас и помочь вам!

Код:
#include "IE.au3"

Dim $descript
$file = "http://www.shutterstock.com/pic-1097173.html"

$oIE = _IECreate($file)
$oInputs = _IETagNameGetCollection ($oIE, "span")
;~ ConsoleWrite(@extended)
For $oInput In $oInputs
	If $oInput.className <> "0" Then 
		If ($oInput.className = "spec-value" And $oInput.innerText = "Flax seed full screen") Then
			MsgBox(0, '<span class="' & $oInput.className & '">' & $oInput.innerText & '</span>', 'Текст: ' & $oInput.innerText )
		EndIf
	EndIf
Next
 

Gealut

Новичок
Сообщения
38
Репутация
0
Garrett сказал(а):
Ваша задача описывается достаточно просто:
Дано: _http://www.shutterstock.com/pic-1097173.html
Требуется: вытащит текст ‘Flax seed full screen’
Это позволит быстрее понять вас и помочь вам!

Извините, вы неправильно поняли мою задачу.

Дано: _http://www.shutterstock.com/pic-1097173.html
Требуется: вытащить текст, который находится между <span class="spec-value"> и </span>
Какой там текст - я заранее не знаю (потому что указанная страница - это только пример, адреса таких страниц будут перебираться в цикле, их будут сотни).

Предложенный вами способ (первый) выдает неоднозначный результат (при тестовом прогоне получилось 23-24 сообщения с разным текстом), мне же надо получить один результат, так как <span class="spec-value"> для этого html уникально (встречается один раз).
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Первый вариант я зачеркнул, он не пойдёт, так как я исходил из приведённых вами данных!
Второй вариант ищет заранее известные данные.
так как <span class="spec-value"> для этого html уникально (встречается один раз).
Вы ошибаетесь, это выражение не уникально, уникален, может быть текст, заключённый между тегами, иначе бы оно не встречалось бы 24 раза.
Извиняюсь я ошибся, да выражение встречается единожды. Это атрибут
Код:
class="spec-value"
не уникален.
Хорошо я вас понял, сейчас сообразим! :smile:




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

Попробуйте второй вариант убрав вот это в If:
Код:
;...
And $oInput.innerText = "Flax seed full screen"
;...
 

Gealut

Новичок
Сообщения
38
Репутация
0
Поиск текста <span class="spec-value"> выдает единственный результат.

На самом деле я из этих html буду еще keywords вытаскивать, это то, что между <a x_shutterstock_keyword=" и " href= . Их в каждом файле от10 до 30-40. Понятно, что циклом выбирать и склеивать в строку в нужном формате, это не проблема уже будет. Главное разобраться как вытаскивать текст между тегами.

Поэтому и хотелось разобраться с регулярными выражениями, чтобы легко задавать нужные выражения.


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

Garrett сказал(а):
Попробуйте второй вариант убрав вот это в If:

Так работает, спасибо, сейчас буду разбираться с этим кодом, пытаться понять его :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Gealut [?]
Так работает, спасибо, сейчас буду разбираться с этим кодом, пытаться понять его
Этот код ищет в Html документе все span теги и проверяет наличие атрибута class="spec-value". Так как такое сочетание тега встречается единожды, то мы вытаскиваем его текст.
P.S. Атрибут class="spec-value" содержат ещё и div`ы.
 

Gealut

Новичок
Сообщения
38
Репутация
0
Спасибо, более-менее разобрался, вытаскивание кейвордов сделал по аналогии, все работает.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Gealut [?]
Сорри, что-то никак у меня не получается использовать аналог этого регулярного выражения:

snoitaleR [?]
Наверное, не срабатывает конструкция IE для локальных файлов...
Gealut

Попробуй посмотреть перед запуском регулярного выражения содержание $str1 :
Код:
$str1 = _IEDocReadHTML($oIE)
MsgBox(0,'$str1',$str1,1)
$descript  = StringRegExpReplace ............

Возможно текст у тебя не успевает прочитаться и есть ли вообще там нужный текст
У меня например вся твоя конмтрукция нормально работает
 
Верх