Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Получить заголовок страницы в Интернете (http://forum.oszone.net/showthread.php?t=325562)

Паразит 04-04-2017 12:41 2726095

Получить заголовок страницы в Интернете
 
Привет. Такая задача.
Надо получить заголовок страницы, которая расположена на удалённом сервере.
Т.е., надо получить текст между тэгами <TITLE>.
С помощью каких встроенных функций можно такое сделать?

Mike909 04-04-2017 13:12 2726104

Вот так примерно:

Код:

#include <IE.au3>

Local $oIE, $oLinks, $tags
Local $link = "http://www.example.com/"
_IEErrorNotify(False)

; Открываем IE
If  IsObj($oIE) Then
  _IEQuit($oIE)
EndIf 
$oIE=_IECreate($link,1,0,1)   

ConsoleWrite ( $link & @LF)
_IENavigate($oIE, $link, 0)      ; тут не ждем пока загрузится
_IELoadWait($oIE, 5000 , 15000)      ;  а тут ждем максимум 15 сек
       
If not @error Then       
                    $tags = $oIE.document.GetElementsByTagName("title")       
                    if  IsObj($tags) Then
                        ConsoleWrite ('tags=' & $tags.Length & @LF)
                        Sleep(200)
                        For $tag in $tags                       
                            $class_value = $tag.className
                            $innerText_value = _IEPropertyGet($tag, 'innertext')
                            ConsoleWrite ('innerText_value=' & $innerText_value &@LF)                     
                        Next
                    Else
                      ConsoleWrite ('tags no obj' & @LF)
                    EndIf
EndIf

If IsObj($oIE) Then
  _IEQuit($oIE)
EndIf
ConsoleWrite ("Exit au3." & @LF)


Паразит 04-04-2017 14:26 2726120

Чё-то он выдаёт ошибку. В файле IE.au3 344-я строка.

Код:

$sTmp = $oWindow.type ; Is .type a valid property?
$sTmp = $oWindow^Error


Mike909 04-04-2017 15:10 2726128

У меня без ошибок. Пробовал разные ссылки и https тоже.
IE 11 на Windows 10 x32, autoit 3.14

Паразит 04-04-2017 15:38 2726136

А у меня Хрюша и IE 6.
Ну ладно, спасибо.

Mike909 04-04-2017 15:41 2726137

на хрюше вроде ie 8 или даже 9 есть )))

Iska 04-04-2017 15:49 2726138

Mike909, какой смысл в вечно ложном условии:
Код:

If  IsObj($oIE) Then
  _IEQuit($oIE)
EndIf

?! Какой смысл делать переход на ссылку два раза:
Код:

$oIE=_IECreate($link,1,0,1)   

_IENavigate($oIE, $link, 0)

?


Мой вариант:
Скрытый текст
Код:

#include <IE.au3>
#include <MsgBoxConstants.au3>

AutoItSetOption("MustDeclareVars", 1)

Local $oIE        = _IECreate("https://www.google.com", 0, 0)
Local $oDocument = _IEDocGetObj($oIE)
MsgBox($IDOK, "https://www.google.com", $oDocument.title)

_IENavigate($oIE, "http://www.yandex.ru/")
$oDocument = _IEDocGetObj($oIE)
MsgBox($IDOK, "http://www.yandex.ru/", $oDocument.title)

_IEQuit($oIE)

Exit(0)


Паразит 04-04-2017 16:23 2726144

Iska, спасибо. Ваш скрипт работает. Интересно, а будет ли он работать на любых операционных системах?
Хотя-бы, чтобы начиная с ХР, кончая 10-ой. И чтобы от разрядности не зависел.

Iska 04-04-2017 16:27 2726147

Паразит, проверяйте, мне не на чем. Могу сказать одно: работать будет не везде. Например, данный форум и сайт на IE11 без установки режима совместимости дадут ошибку обработки. Соответственно, и скрипт «обломается».

Паразит 04-04-2017 16:29 2726148

А как выставить такой режим?

Iska 04-04-2017 16:50 2726156

Паразит, не интересовался. Видимо получать номер версии IE, сравнивать и добавлять по нужде сайт в списки: Programmatically add a site to Compatibility View list.

Mike909 04-04-2017 18:46 2726191

Цитата:

Цитата Iska
?! Какой смысл делать переход на ссылку два раза: »

Это остатки другого скрипта, здесь я просто не доглядел, когда урезал. Так то конечно не нужно.

Iska 04-04-2017 19:11 2726197

Mike909, ясно.

Creat0R 05-04-2017 00:42 2726255

Паразит,
Код:

$sURL = 'http://forum.oszone.net/post-2726095.html'
$sTitle = StringRegExpReplace(BinaryToString(InetRead($sURL)), '(?si).*?<title>|</title>.*', '')
;$sTitle = StringRegExp(BinaryToString(InetRead($sURL)), '<title>(.*?)</title>', 3)[0]
MsgBox(0, @ScriptName, $sTitle)


Паразит 05-04-2017 05:19 2726277

Creat0R, это то, что мне нужно. Просто и со вкусом. Но.

1. Не работает с защищённым соединением (HTTPS).
2. Если страница UTF-8, то выводятся кракозябры.

Я думаю, что второе это ерунда (легко поправимо), а вот с первым - я думаю, что не ерунда.

Iska 05-04-2017 09:17 2726313

Цитата:

Цитата Паразит
1. Не работает с защищённым соединением (HTTPS). »

Пример, где не работает. На https://ya.ru/ — у меня сработало.

Цитата:

Цитата Паразит
Я думаю, что второе это ерунда (легко поправимо) »

Это не совсем так. Хорошо, если Вы заранее знаете, в каком виде и в какой кодировке отдаётся содержимое. Но в общем случае, при произвольном взятом url, начинается жёппа.

Паразит 05-04-2017 09:50 2726324

Iska, точно. Не работает, если не указан протокол.

Так работает:

Код:

http://wincmd.ru/
А так нет:

Код:

www.wincmd.ru
wincmd.ru


Iska 05-04-2017 09:57 2726326

Паразит, протокол желательно указывать. Ведь схема является составной и обязательной частью URI.

Creat0R 05-04-2017 12:56 2726390

Код:

$sURL = 'http://wincmd.ru'

$sHtml = BinaryToString(InetRead($sURL))
$aTitle = StringRegExp($sHtml, '<title>(.*?)</title>', 3)

If Not @error Then
    $sTitle = (_Encoding_IsUTF8Format($aTitle[0]) ? BinaryToString(StringToBinary($aTitle[0]), 4) : $aTitle[0])
    MsgBox(0, @ScriptName, $sTitle)
EndIf

Func _Encoding_IsUTF8Format($sText, $iCheckASCIICode = False)
    Local $iAsc, $iExt, $iLen = StringLen($sText), $bLess128 = True

    For $i = 1 To $iLen
        $iAsc = Asc(StringMid($sText, $i, 1))

        If $iCheckASCIICode And $iAsc > 128 Then $bLess128 = False

        If Not BitAND($iAsc, 0x80) Then
            ContinueLoop
        ElseIf Not BitXOR(BitAND($iAsc, 0xE0), 0xC0) Then
            $iExt = 1
        ElseIf Not (BitXOR(BitAND($iAsc, 0xF0), 0xE0)) Then
            $iExt = 2
        ElseIf Not BitXOR(BitAND($iAsc, 0xF8), 0xF0) Then
            $iExt = 3
        Else
            Return False
        EndIf

        If $i + $iExt > $iLen Then Return False

        For $j = $i + 1 To $i + $iExt
            $iAsc = Asc(StringMid($sText, $j, 1))
            If BitXOR(BitAND($iAsc, 0xC0), 0x80) Then Return False
        Next

        $i += $iExt
    Next

    If $iCheckASCIICode Then Return($bLess128 = False)

    Return True
EndFunc


Паразит 05-04-2017 13:11 2726395

Creat0R, великолепно, спасибо. Работает так, как надо.

Iska 05-04-2017 13:20 2726397

Это ещё не всё :):
Код:

$sURL = 'https://koi8.pp.ru/'

Паразит 05-04-2017 13:35 2726401

Iska, а почему не работает? Потому что кодировка?
Или robots.txt не позволяет?
Или слишком сложная доменная структура?

Iska 05-04-2017 13:45 2726403

Цитата:

Цитата Паразит
Iska, а почему не работает? Потому что кодировка? »

Потому что там KOI-8.

Паразит 05-04-2017 13:52 2726404

Я думаю, что сайтов с такой кодировкой уже почти не существует

Iska 05-04-2017 14:42 2726414

Угу: Usage Statistics of Character Encodings for Websites, April 2017. Но они есть. И, видите ли… уже почти не существует машин на Windows XP, но те, что есть, приходится учитывать. Так и тут — если рассматривать вопрос не в каком-то частном контексте, а в целом.

Creat0R 06-04-2017 02:08 2726577

Цитата:

Цитата Паразит
почему не работает? »

Потому что там тег TITLE (заглавными буквами), а в регулярке поиск по умолчанию чувствительный к регистру букв (нужно в начало добавлять (?i)).

Что касается кодировки, то это тоже можно решить (но здесь это не требуется):

Код:

#include <Encoding.au3>

$sURL = 'https://koi8.pp.ru/'

$sHtml = BinaryToString(InetRead($sURL))
$aTitle = StringRegExp($sHtml, '(?i)<title>(.*?)</title>', 3)

If Not @error Then
    $sTitle = (_Encoding_IsUTF8Format($aTitle[0]) ? BinaryToString(StringToBinary($aTitle[0]), 4) : $aTitle[0])
    $sTitle = (_Encoding_GetCyrillicANSIEncoding($sTitle) = 'KOI8-R' ? _Encoding_KOI8To1251($sTitle) : $sTitle)

    MsgBox(0, @ScriptName, $sTitle)
EndIf

Библиотеку Encoding.au3 брать отсюда.


Время: 02:49.

Время: 02:49.
© OSzone.net 2001-