Автор Тема: Простой парсер HTML кода HTMLFILE  (Прочитано 40324 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Простой парсер HTML кода
« Ответ #30, Отправлен: Февраль 12, 2015, 03:09:12 »
Никак не могу понять, данный скрипт у меня периодический зависает:

Код: AutoIt [Выделить]
$oHTML = ObjCreate('HTMLFILE')
If Not IsObj($oHTML) Then Exit

$sHTML = BinaryToString(InetRead('http://devid.info/en/search?text=dell'))

$oHTML.Write($sHTML)

$oList = $oHTML.GetElementById('os-list-6.1')
$oItems = $oList.childNodes

ConsoleWrite($oItems.length & @LF)

For $oItem In $oItems
    If $oItem.Attributes('class').Value == 'item-box' Then
        ConsoleWrite($oItem.innertext & @LF)
    EndIf
Next


Система Win7 X64 Rus (AutoIt 3.3.6.1 -> 3.3.12.0 x86, хотя и под x64 тоже самое).
IE8.
Кто то может проверить у себя? запускать по несколько раз, у меня раза со второго-третьего скрипт намертво повисает.

« Последнее редактирование: Февраль 12, 2015, 03:21:13 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Re: Простой парсер HTML кода
« Ответ #30 Отправлен: Февраль 12, 2015, 03:09:12 »

Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 940
  • Репутация: 202
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Простой парсер HTML кода
« Ответ #31, Отправлен: Февраль 12, 2015, 03:22:23 »
CreatoR
Виной тому InetRead. Меняйте на альтернативные методы.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Простой парсер HTML кода
« Ответ #32, Отправлен: Февраль 12, 2015, 03:46:14 »
firex  [?]
Цитировать
Виной тому InetRead
Я записал в файл то что получил с инета, далее читаю с файла, но результат тот же.
В чём проблематичность InetRead?

Да и ещё, когда зависает, система иногда выдаёт вот такое сообщение:

Нажмите для отображения изображения в оригинальном размере.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Простой парсер HTML кода
« Ответ #33, Отправлен: Февраль 12, 2015, 06:58:21 »
Попробовал со всеми мне известными методами получения Html, вывод однозначный - дело не в этом.

Дело в размере получаемой информации, нужно проверить есть ли ограничения у этого объекта...

Обновление
Для инициализации Html, нужно использовать не .Write($sHtml), а .Body.InnerHtml = $sHtml!
« Последнее редактирование: Февраль 12, 2015, 07:24:39 от CreatoR »

Русское сообщество AutoIt

Re: Простой парсер HTML кода
« Ответ #33 Отправлен: Февраль 12, 2015, 06:58:21 »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3989
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Простой парсер HTML кода
« Ответ #34, Отправлен: Февраль 12, 2015, 11:41:26 »
CreatoR
Почему вы избегаете методов open и close?
Код: AutoIt [Выделить]
$oHTML.Open
$oHTML.Write($sHTML)
$oHTML.Close

Цитировать
Кто то может проверить у себя?
У меня скрипт отрабатывает без проблем. Win7 X64, WinXP SP2
Код: AutoIt [Выделить]
$oHTML = ObjCreate('HTMLFILE')
If Not IsObj($oHTML) Then Exit

$sHTML = BinaryToString(InetRead('http://devid.info/en/search?text=dell'))

$oHTML.Open
$oHTML.Write($sHTML)
$oHTML.Close

$oList = $oHTML.GetElementById('os-list-6.1')
$oItems = $oList.childNodes

ConsoleWrite($oItems.length & @LF)

For $oItem In $oItems
    If $oItem.Attributes('class').Value == 'item-box' Then
        ConsoleWrite($oItem.innertext & @LF)
    EndIf
Next

« Последнее редактирование: Февраль 12, 2015, 19:49:36 от Garrett »

Скорблю и помню.




Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Простой парсер HTML кода
« Ответ #35, Отправлен: Февраль 12, 2015, 12:09:52 »
Garrett  [?]
Цитировать
У меня скрипт отрабатывает без проблем.
У меня тоже. Win7 X32, WinXP SP3 X32.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Простой парсер HTML кода
« Ответ #36, Отправлен: Февраль 12, 2015, 16:51:10 »
Garrett  [?]
Цитировать
Почему вы избегаете методов open и close?
Я это использовал, просто в примере забыл указать.
У меня с этим скрипт зависает (не всегда).
А с .Body.InnerHtml = $sHtml - нет.

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3989
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Простой парсер HTML кода
« Ответ #37, Отправлен: Февраль 12, 2015, 20:54:24 »
CreatoR  [?]
Цитировать
А с .Body.InnerHtml = $sHtml - нет.
Код: AutoIt [Выделить]
$oHTML = ObjCreate('HTMLFILE')
If Not IsObj($oHTML) Then Exit

$oHTML.Open

#Region Пример 1
;~ $oHTML.Write("<div>Hi!</div>")
#EndRegionПример 1

#Region Пример 2
$oHTML.Body.InnerHtml = "<p>Hi!</p>" ; НЕ правильно! (поэтому и не виснет)
#EndRegionПример 2

#Region Пример 3
;~ $oHTML.Body
;~ $oHTML.Write("<div>Hi!</div>")
#EndRegionПример 3

$oHTML.Close

ConsoleWrite(StringFormat("> Body Outer Html: --> %s\n", (Not StringStripWS($oHTML.Body.OuterHtml, 3)) ? "не правильно" : StringStripWS($oHTML.Body.OuterHtml, 3)))


Русское сообщество AutoIt

Re: Простой парсер HTML кода
« Ответ #37 Отправлен: Февраль 12, 2015, 20:54:24 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Простой парсер HTML кода
« Ответ #38, Отправлен: Февраль 12, 2015, 21:22:43 »
Ну а как оно работает если неправильно?

Код: AutoIt [Выделить]
$oHTML = ObjCreate('HTMLFILE')
If Not IsObj($oHTML) Then Exit

$oHTML.body.InnerHtml = "<p id='test'>Hi!</p><p id='0'>buy</p>"

ConsoleWrite($oHTML.GetElementById('test').innertext & @LF)


Просто Open/Close не нужно в этом случае.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Простой парсер HTML кода
« Ответ #39, Отправлен: Февраль 16, 2015, 02:11:18 »
В общем вот что из этого сделал: HtmlXPath - Обработка XPath запросов для Html

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Простой парсер HTML кода
« Ответ #40, Отправлен: Февраль 16, 2015, 10:44:36 »
CreatoR  [?]
Цитировать
$oHTML.body.InnerHtml = "<p id='test'>Hi!</p><p id='0'>buy</p>"
Уточнение, так можно сделать, если не нужен <head>

Код: AutoIt [Выделить]
$document = ObjCreate('HTMLFILE')
$html = "<html><head><meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8""></head><body><div>hello</div><p id='test'>Hi!</p><p id='0'>buy</p></body></html>"
$document.body.InnerHtml = $html
;~ $document.write($html)
ConsoleWrite($document.documentElement.outerHTML & @CRLF)


Через innerHtml
<html><head></head><body><div>hello</div><p id="test">Hi!</p><p id="0">buy</p></body></html>Через write
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><div>hello</div><p id="test">Hi!</p><p id="0">buy</p></body></html>

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Простой парсер HTML кода
« Ответ #41, Отправлен: Февраль 16, 2015, 12:36:34 »
inververs  [?]
Цитировать
Уточнение, так можно сделать, если не нужен <head>
Head может и нужен, но что делать если скрипт зависает с $document.write($html)?

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3989
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Простой парсер HTML кода
« Ответ #42, Отправлен: Февраль 16, 2015, 12:45:48 »
CreatoR  [?]
Цитировать
но что делать если скрипт зависает
IMHO это из-за JS скриптов. В частности document.write.

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Простой парсер HTML кода
« Ответ #43, Отправлен: Февраль 16, 2015, 13:23:16 »
CreatoR  [?]
Цитировать
Head может и нужен, но что делать если скрипт зависает с $document.write($html)?
Еще может зависнуть из-за ActiveX... Может зависнуть из-за любого диалога или предупреждения.
К примеру:
Код: AutoIt [Выделить]
<html><head><body><script>alert(0);</script></body></html>

, пока не закроешь, будет ждать.
Тут такое же поведения, как и в браузере, поэтому любо запрещать выполнения JS, либо перед записью чистить от скриптов, стилей, cddata, фреймов итп.

Garrett  [?]
Цитировать
IMHO это из-за JS скриптов. В частности document.write.
+1


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Простой парсер HTML кода
« Ответ #44, Отправлен: Февраль 16, 2015, 14:16:09 »
Хорошо, тогда как по отключать все эти обработчики?

Русское сообщество AutoIt

Re: Простой парсер HTML кода
« Ответ #44 Отправлен: Февраль 16, 2015, 14:16:09 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
6605 Просмотров
Последний ответ Апрель 23, 2012, 19:14:27
от ggzgamer
5 Ответов
2901 Просмотров
Последний ответ Октябрь 31, 2014, 14:07:45
от denispuh
1 Ответов
2298 Просмотров
Последний ответ Апрель 20, 2013, 21:12:41
от sngr
3 Ответов
1960 Просмотров
Последний ответ Сентябрь 28, 2013, 13:38:52
от bdkitty
0 Ответов
713 Просмотров
Последний ответ Июль 24, 2014, 19:17:23
от e.belykh
6 Ответов
1786 Просмотров
Последний ответ Февраль 05, 2015, 11:44:42
от darkwhite
8 Ответов
2790 Просмотров
Последний ответ Март 06, 2015, 21:17:45
от Nosfer_x
30 Ответов
14117 Просмотров
Последний ответ Апрель 26, 2015, 11:54:58
от Garrett
0 Ответов
892 Просмотров
Последний ответ Апрель 22, 2015, 17:49:49
от madmasles
1 Ответов
3045 Просмотров
Последний ответ Июнь 22, 2015, 13:17:44
от madmasles