Что нового

Интеграция HtmlAgilityPack в AutoIt

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
HtmlAgilityPack написан на .Net, экспортируемых функции или поддержки COM не имеет, поэтому для её использования нужно загрузить её и скомпилировать в реальном времени.

Вот тут есть пример как это сделать, но конкретно для этой Dll оно почему то не работает.

С помощью PowerShell без проблем можно загрузить эту Dll:

Код:
Add-Type -Path "HtmlAgilityPack.dll"
$doc = New-Object HtmlAgilityPack.HtmlDocument

А как быть с AutoIt, я не хочу привязываться к PowerShell, хотя бы потому, что в XP его нужно устанавливать.

И ещё, если кто то знает можно ли и как его использовать с QuerySelector, было бы круто.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
У меня без проблем зарегистрировался. Может тебе нужно поставить соответствующий .Net?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
И создаёт объект HtmlAgilityPack.HtmlDocument?
Да.
Регистрация:
Код:
RegAsm HtmlAgilityPack.dll /codebase

Я уже давно на него глаз положил :smile:
Единственное, некоторые методы не работают. Я полагаю это просто от моего незнания NET :-[
Я использую HtmlAgilityPack в некоторых своих небольших проектах.


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

Кстати, вот пример к вашему посту XPath. :smile:
Код:
$sHtml = _
	'<body>' & @CRLF & _
	'<div id="test">' & @CRLF & _
	'	<div class="item-box">data1</div>' & @CRLF & _
	'	<div class="item-box">data2</div>' & @CRLF & _
	'	<div class="item-box">data3</div>' & @CRLF & _
	'	<div class="item-box">data4</div>' & @CRLF & _
	'	<div class="item-box">data5</div>' & @CRLF & _
	'</div>' & @CRLF & _
	'<div id="test1">' & @CRLF & _
	'	<div class="item-box">data6</div>' & @CRLF & _
	'</div>' & @CRLF & _
	'</body>'

$oDoc = ObjCreate("HtmlAgilityPack.HtmlDocument")
ObjEvent("AutoIt.Error", "_ErrFunc")

$oDoc.LoadHtml($sHtml)
$oLinks = $oDoc.DocumentNode.SelectNodes('//div[@id="test"]/div')
For $i = 0 To $oLinks.Count -1
	ConsoleWrite(StringFormat('Html: %s\n', $oLinks($i).outerHtml))
	ConsoleWrite(StringFormat('Text: %s\n', $oLinks($i).innerText))
Next

Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
            @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
            @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
            @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
            @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc

Красота, неправда ли? :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR
В скаченном zip архиве есть папки с разными версиями. Я ставил Net40, так как у меня стоит ..\Microsoft.NET\Framework\v4.0.30319
Регистрировал так:
Код:
Win+R - > cmd
Далее:
Код:
..\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe C:\MyProjects\HtmlAgilityPack\HtmlAgilityPack.dll /codebase
 

Вложения

  • Net40.zip
    133.1 КБ · Просмотры: 9
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Garrett
Можно ту версию HtmlAgilityPack.dll что ты используешь?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR
Прикрепил постом выше.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Сработало!!!

Единственное что осталось сделать, так это корректно проверить версию Framework на компьютере, и соответственно подставлять версию HtmlAgilityPack.dll...

А если саму RegAsm таскать собой, или весь Framework нужен для этого?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
или весь Framework нужен для этого?
IMHO весь нужен.
Думаю это не проблема, так как Framework это само собой разумеющееся.
Я заметил, что некоторые методы не работают. Однако есть мысль, что это я делаю что-то не то. :smile:
К примеру запись в файл (метод Save(String) объекта HtmlDocument) мне так и не удалось задействовать, видимо нужно подключать дополнительные библиотеки NET (IMHO).
Кстати, вот вам справка в chm формате.

P.S. Прикрепить файл не удалось, вставил ссылку.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Garrett
QuerySelector я так понимаю там не поддерживается?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Там есть свойство CopyTo, я так понял это для вывода результата в массив, как этим пользоваться? :scratch:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
QuerySelector я так понимаю там не поддерживается?
А зачем? XPath решает практически любую задачу.

Там есть свойство CopyTo, я так понял это для вывода результата в массив, как этим пользоваться?
Да, CopyTo предназначен для копирования коллекции в массив.
Однако заставить работать этот метод у меня так и не получилось, выдаёт ошибку несовпадение типов. IMHO в Autoit не получится использовать такие методы.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Garrett [?]
А зачем? XPath решает практически любую задачу.
Для этого :smile:.

Интересно, может можно как то трансформировать строку CSS селектора (query) в строку XPath?
Что для этого нужно учитывать?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR
Дайте пожалуйста пример где задача должна решаться только с помощью QuerySelector, чтобы я сориентировался о чём речь.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Garrett [?]
пример где задача должна решаться только с помощью QuerySelector, чтобы я сориентировался о чём речь.
Это просто как вариант для библиотеки, меня лично XPath устраивает, я просто хочу реализовать оба варианта для библиотеки (не используя лишних ресурсов).
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
я просто хочу реализовать оба варианта
IMHO дело в том, что практически любую задачу по разбору HTML кода можно проделать с помощью XPath.
Что касаемо поиска по селектору (как это сделано в Htmlayout или в jQuery), то это тот же XPath только средствами собственных парсеров кода.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Garrett [?]
это тот же XPath только средствами собственных парсеров кода
Так XPath в HtmlAgilityPack тоже реализован собственным парсером, или я что то путаю?
Если он берёт функционал из .Net Framework, то зачем он мне нужен, ведь наверняка можно подобраться к этому функционалу из AutoIt...

как это сделано в Htmlayout или в jQuery
jQuery тоже имеет dll версию?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
[box title=Селекторы]Селекторами называют строчные выражения, с помощью которых задаются условия поиска элементов DOM на странице.
Селекторы позволяют находить элементы по различным признакам: значению атрибутов, содержимому элементов, родительским элементам, дочерним элементам, порядковым номерам, ну и конечно по именам классов, идентификаторов и/или тегов.[/box]


CreatoR [?]
Так XPath в HtmlAgilityPack тоже реализован собственным парсером, или я что то путаю?
Нет, не путаете :smile:
XPath это язык запросов, такой же как и SQL и не более того. Все библиотеки используют синтаксис XPath, Htmlayout и HtmlAgilityPack не исключение. :smile:
Я просто хочу понять, зачем вы используете HtmlAgilityPack и Htmlayout одновременно? Разве для большинства задач не хватает возможностей HtmlAgilityPack?

Если он берёт функционал из .Net Framework, то зачем он мне нужен, ведь наверняка можно подобраться к этому функционалу из AutoIt...
Не понял вопроса :smile:
HtmlAgilityPack.dll написан на .NET, посему ей необходим .Net Framework.
IMHO подобраться к полному функционалу .Net Framework из Autoit будет сложно, проще пользоваться её COM классами.

jQuery тоже имеет dll версию?
Нет, jQuery написана на JavaScript. Я имел ввиду то, что она тоже использует XPath.
 
Верх