Что нового

Простой парсер HTML кода HTMLFILE

alex33

Скриптер
Сообщения
1,457
Репутация
186
araneon сказал(а):
CreatoR Спасибо, но так выдаёт ошибку
Код:
"C:\Program Files\AutoIt3\Include\IE.au3" (272) : ==> The requested action with this object has failed.:
$oObject.navigate($sUrl)
$oObject^ ERROR
Re: Ошибка: The requested action with this object has failed
alex33 сказал(а):
А вообще, эта ошибка возникает у многих, в том числе и у меня. Выход я вижу только один, поставить AutoIt версии 3.3.12.0 или ниже (Previous Versions).
 

araneon

Новичок
Сообщения
59
Репутация
0
alex33 Спасибо, попробовал на 3.3.8.1 выдаёт
Код:
E:\Scripts\AutoIt3_v3.3.8.1\Include\IE.au3 (314) : ==> The requested action with this object has failed.:
$o_object.navigate($s_Url)
$o_object.navigate($s_Url)^ ERROR
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пытаюсь удалить элемент с этой штукой:

Код:
$sHtml = BinaryToString(InetRead('http://autoit-script.ru'))
$sHtml = __NodeRemove($sHtml, 'div.share42init')
ConsoleWrite(StringInStr($sHtml, '<div class=share42init') & @CRLF)

Func __NodeRemove($sHtml, $sSelector, $bChilds = True)
	Local Static $oHtml = ObjCreate('htmlfile')
	
	$oHtml.body.innerhtml = $sHTML
	
	Local $oSelect = $oHtml.querySelector($sSelector)
	
	If IsObj($oSelect) Then
		$oSelect.RemoveNode($bChilds)
	EndIf
	
	$sRet = $oHtml.body.innerhtml
	
	Return $sRet
EndFunc


но тут querySelector не срабатывает, в чём может быть причина? :scratch:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
в чём может быть причина
Версия браузера, полностью поддерживающая метод.
MethodChromeInternet Explorer / EdgeFirefoxSafariOpera
querySelector()4.08.03.53.210.0
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Garrett [?]
Версия браузера, полностью поддерживающая метод.
У меня IE 11.
Я так понял объект HtmlFile работает с установленным IE?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Так же работает:

Код:
Func __RemoveNode($sHtml, $sSelector, $bChilds = True)
	$oIE = _IECreate('', 0, 0, 0, 0)
	_IEBodyWriteHTML($oIE, $sHtml)
	
	Local $oSelect = $oIE.document.querySelector($sSelector)
	
	If IsObj($oSelect) Then
		$oSelect.RemoveNode($bChilds)
	EndIf
	
	Local $sRet = _IEBodyReadHTML($oIE)
	
	_IEQuit($oIE)
	
	Return $sRet
EndFunc
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
Я так понял объект HtmlFile работает с установленным IE?
Нет. То есть да, но версия самая младшая. До Win7 была IE6, после IE7. В Win10 не знаю.
Код:
$sHtml = BinaryToString(InetRead('http://autoit-script.ru'))
$sHtml = __NodeRemove($sHtml, 'div.share42init')
;~ ConsoleWrite(StringInStr($sHtml, '<div class=share42init') & @CRLF)
ConsoleWrite($sHtml & @CRLF)

Func __NodeRemove($sHtml, $sSelector, $bChilds = True)
   Local Static $oHtml = ObjCreate('htmlfile')

   $oHtml.body.innerhtml = $sHTML
   $sUserAgent = $oHtml.parentWindow.navigator.userAgent

   Return $sUserAgent

   Local $oSelect = $oHtml.querySelector($sSelector)

   If IsObj($oSelect) Then
	  $oSelect.RemoveNode($bChilds)
   EndIf

   $sRet = $oHtml.body.innerhtml

   Return $sRet
EndFunc



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

CreatoR [?]
Так же работает
Так вы запускаете самую последнюю установленную версию браузера IE.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Где то в реестре вписывается какой версии движок использовать.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
В общем, браузер IE работает отдельно от объекта HTMLFILE и версии различаются. Отбирай по одному через перебор, через цикл и удаляй.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs [?]
Где то в реестре вписывается какой версии движок использовать
Вот если сделать так:

Код:
$sHtml = StringReplace($sHtml, '<head>', '<head><meta http-equiv="X-UA-Compatible" content="IE=edge" />')


то показывает в User-Agent IE8, но всё равно не работает...

Ещё одна проблема с HtmlFile, теги и атрибуты возвращаются в большом регистре.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Про большой регистр - они, кажется, всегда так возвращаются. Просто каждый вывод пропускай через .toLowerCase / StringLower
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
alex33 [?]
каждый вывод пропускай через .toLowerCase / StringLower
Не вариант - внутренний текст не должен менять регистр.

В общем нужен нормальный инструмент для работы с DOM, без использования IE.
 
Верх