Что нового

[Сеть, интернет] Получение списков типов тегов из коллекций элементов (id,classname и т. д.)

SemEMP

Знающий
Сообщения
42
Репутация
7
Пишу "парсер" всех форм и элементов в них, так же фсех фреймов и всех коллекций элементов. Это чтобы удобно вытаскивать/искать из страницы для которой делается (например бот или просто программа для авторизации) всех коллекций элементов.
Сам недоделанный "парсер" вложен.

Проблема: Наподобие кода ниже хочу универсально вытаскивать список типов тегов(id, tagname, classname, value, title, type и т. д.), а не только те, которые я задал. Как вытащить эти данные из любой страницы, заведомо не порыв в её html коде и не зная какие там типы тегов есть в каждом элементе?

Код:
#include <IE.au3>
#include <Array.au3>
#include <String.au3>
#include <Excel.au3>
#include <GUIConstants.au3>

$oIE = _IEAttach ("Окно")
$oFrame = _IEFrameGetObjByName($oIE, 'Фрейм')
dim $a[1][11]
$oElements = _IETagNameAllGetCollection ($oFrame)
$iNum = @extended
$ia=1
For $oElement In $oElements
	_IEErrorHandlerRegister ("MyErrFunc")
	ReDim $a[$ia+1][11]
	$a[$ia][0]=$oElement.id
	$a[$ia][1]=$oElement.tagname
	$a[$ia][2]=$oElement.innerText
	$a[$ia][3]=$oElement.innerHTML
	$a[$ia][4]=$oElement.classname
	$a[$ia][5]=$oElement.title
	$a[$ia][6]=$oElement.outerhtml
	$a[$ia][7]=$oElement.name
	$a[$ia][8]=$oElement.type
	$a[$ia][9]=$oElement.href
	$a[$ia][10]=$oElement.value
	$ia+=1
Next
$a[0][0] = "ID"
$a[0][1] = "tag"
$a[0][2] = "innerText"
$a[0][3] = "innerHTML"
$a[0][4] = "classname"
$a[0][5] = "title"
$a[0][6] = "outerhtml"
$a[0][7] = "name"
$a[0][8] = "type"
$a[0][9] = "href"
$a[0][10] = "value"
;~ $oExcel = _ExcelBookNew()
;~ _ExcelWriteSheetFromArray($oExcel, $a, 1, 1, 0, 0)
_ArrayDisplay($a,$iNum)
Func MyErrFunc()
    ; Important: the error object variable MUST be named $oIEErrorHandler
EndFunc  ;==>MyErrFunc
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Код:
_IEDocReadHTML()
StringRegExp()

Для рэгэкспа могу предложить:
Код:
</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)/?>
 
Автор
S

SemEMP

Знающий
Сообщения
42
Репутация
7
Код: AutoIt [Выделить]
_IEDocReadHTML()
StringRegExp()
Для рэгэкспа могу предложить:
Код: [Выделить]
</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)/?>
Не могу использовать, как исправить недопёр - слишком уж сложный шаблон

Код:
D:\PROGRAM\AutoIt3\SciTE\SC Показать текст фрейма.au3(19,39) : ERROR: syntax error
$pat='</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
 
Автор
S

SemEMP

Знающий
Сообщения
42
Репутация
7
твой шаблон не сработал, зато я сам дошёл дальше как сделать
Код:
#include <Array.au3>
$s = $oElement.outerHTML
$pat='\<(.*?)\>'
$tt1=StringRegExp($s,$pat,3)
;if @error Then ContinueLoop
$pat='\s([^\s.]*?)='
$tt=StringRegExp($tt1[0],$pat,3)
;if @error Then ContinueLoop
_ArrayDisplay($tt)
 

madmasles

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

$oIE = _IECreate('http://autoit-script.ru/index.php/topic,8613.msg58291/topicseen.html#new')
$sHTML = _IEPropertyGet($oIE, 'innerhtml')

$aHTML = StringRegExp($sHTML, '<([^!-].*?)(?:<|>)', 3)
If @error Then
	MsgBox(16, 'Error', 'StringRegExp')
	Exit
EndIf
_ArrayDisplay($aHTML)
$iCount = 0
Dim $aTag[UBound($aHTML) + 1][2] = [[0, 2]]
For $i = 0 To UBound($aHTML) - 1
	If StringLeft($aHTML[$i], 1) <> '/' Then
		$aTemp = StringRegExp($aHTML[$i], '(?i)\h([a-z]+)=', 3)
		If @error Then ContinueLoop
		$iCount += 1
		$aTag[$iCount][0] = StringRegExpReplace($aHTML[$i], '\h.*$', '')
		$iUb = UBound($aTemp)
		If $iUb + 1 > $aTag[0][1] Then
			ReDim $aTag[UBound($aHTML) + 1][$iUb + 1]
			$aTag[0][1] = $iUb + 1
		EndIf
		For $j = 0 To $iUb - 1
			$aTag[$iCount][$j + 1] = $aTemp[$j]
		Next
	EndIf
Next
ReDim $aTag[$iCount + 1][$aTag[0][1]]
$aTag[0][0] = $iCount
$aTag[0][1] = ''
_ArrayDisplay($aTag)
 
Автор
S

SemEMP

Знающий
Сообщения
42
Репутация
7
SemEMP,
Так, вроде, тоже можно.
Код: AutoIt [Выделить]
Очень интересный вариант, но оставляю пока свой, вопрос с получением тегов у меня закончен, получил вот это, но не могу параметрически получить значение "любого тега". Типа
Код:
$oElement.$name[$k]
, где $name[$k]='type' . Конструкция типа
Код:
$a[$ia][$k]=_IEPropertyGet($oElement,$name[$k])
не срабатывает, так как она предусмотрена только на определённые типы из MSDN .

Результат получения тегов моим способом, плохо одно - значения тегов никак не вытащить :(
Код:
#include <IE.au3>
#include <Array.au3>
#include <String.au3>
#include <INet.au3>
#include <Excel.au3>
#include <GUIConstants.au3>
;~ $oIE = _IEAttach ("Сайт")
;~ $oFrame = _IEFrameGetObjByName($oIE, 'Фрейм')

$oIE = _IECreate('http://autoit-script.ru/index.php/topic,8613.msg58291/topicseen.html#new')
$oFrame=$oIE
dim $a[1][15]
dim $name[1]
dim $namemax=0
$oElements = _IETagNameGetCollection ($oFrame,'div')
;~ $oElements = _IETagNameAllGetCollection ($oFrame)
$ia=0
For $oElement In $oElements
	_IEErrorHandlerRegister ("MyErrFunc")
	$sHTML = $oElement.outerHTML
	$pat='\<(.*?)\>'
	$tt1=StringRegExp($sHTML,$pat,3)
	if @error Then ContinueLoop
	$pat='\s([^\s.]*?)='
	$tt=StringRegExp($tt1[0],$pat,3)
	if @error Then ContinueLoop
	if $namemax=0 Then
		$name=$tt
		$namemax=UBound($tt)
	Else
		_ArrayConcatenate($name,$tt)
		$name=_ArrayUnique ($name)
		_ArrayReverse($name)
		ReDim $name[UBound($name)-1]
		_ArrayReverse($name)
	EndIf
	ReDim $a[$ia+1][UBound($name)]
	for $k=0 to UBound($name)-1
		$a[$ia][$k]=_IEPropertyGet($oElement,$name[$k])
;~ 		$a[$ia][$k]=$oElement.$name[$k]
	Next
	$ia+=1
Next
for $k=0 to UBound($name)-1
	$a[0][$k]=$name[$k]
Next
_ArrayDisplay($a)

Func MyErrFunc()
    ; Important: the error object variable MUST be named $oIEErrorHandler

EndFunc  ;==>MyErrFunc
 
Верх