Чтение веб-контента (может быть RSS) - PullRequest
0 голосов
/ 05 марта 2019

Мне удалось прочитать динамическую информацию с веб-сайта по второй ссылке (закомментировано в коде ниже).Если я раскомментирую вторую строку, она будет работать нормально, и я получу нужную информацию.Если я использую первую ссылку, она не работает;генерируемый файл имеет размер 0 байт.

В первый раз вам может понадобиться нажать какую-нибудь кнопку и снова запустить скрипт (зависит от браузера).Так как же получить желаемый результат?Мне нужен ETA, тот, что вверху: Arrival">ETA</a> : March 23, 2019 </td></tr> </table>.

_RSSGetInfo() тоже не работал (грузоотправитель указывает, что это RSS-лента XML, но я не знаю, является ли этоправильная вещь, она дала мне пробел):

#include <MsgBoxConstants.au3>
#include <IE.au3>
#include <Array.au3>
#include <Date.au3>
#include <String.au3>
#include <Excel.au3>
#include <WinAPIFiles.au3>

#include-once
#region _RSS
; RSS Reader
; Created By: Frostfel
#include <INet.au3>
#include <Array.au3>

; ============================================================================
; Function:        _RSSGetInfo($RSS, $RSS_InfoS, $RSS_InfoE[, $RSS_Info_ = 1])
; Description:     Gets RSS Info
; Parameter(s):    $RSS =  RSS Feed Example: "http://feed.com/index.xml"
;                  $RSS_InfoS = String to find for info start Example: <title>
;                  $RSS_InfoE = String to find for info end Example: </title>
;                  $RSS_Info_Start = [optional] <info>/</info> To start at
;                                   Some RSS feeds will have page titles
;                                   you dont want Defualt = 0
; Requirement(s):  None
; Return Value(s): On Success - Returns RSS Info in Array Starting at 1
;                  On Failure - Returns 0
;                               @Error = 1 - Failed to get RSS Feed
; Author(s):       Frostfel
; ============================================================================
Func _RSSGetInfo($RSS, $RSS_InfoS, $RSS_InfoE, $RSS_Info_Start = 0)
    $RSSFile = _INetGetSource($RSS)
    If @Error Then
        SetError(1)
        Return -1
    EndIf
    Dim $InfoSearchS = 1
    Dim $Info[1000]
    Dim $InfoNumA
    $InfoNum = $RSS_Info_Start
    While $InfoSearchS <> 6
        $InfoNum += 1
        $InfoNumA += 1
        $InfoSearchS = StringInStr($RSSFile, $RSS_InfoS, 0, $InfoNum)
        $InfoSearchE = StringInStr($RSSFile, $RSS_InfoE, 0, $InfoNum)
        $InfoSearchS += 6
        $InfoSS = StringTrimLeft($RSSFile, $InfoSearchS)
        $InfoSearchE -= 1
        $InfoSE_Len = StringLen(StringTrimLeft($RSSFile, $InfoSearchE))
        $InfoSE = StringTrimRight($InfoSS, $InfoSE_Len)
        _ArrayInsert($Info, $InfoNumA, $InfoSE)
    WEnd
    Return $Info
EndFunc
#endregion

$Link = "http://wcf.mscgva.ch/publicasmx/Tracking.asmx/GetRSSTrackingByContainerNumber?ContainerNumber=MSCU4727397"
$Test1 = _RSSGetInfo($Link, "<channel>", "</channel>", 1)
MsgBox(0, "Test", $Test1)

Ответы [ 2 ]

0 голосов
/ 07 марта 2019
; Url to get the source from.
$sUrl = 'http://wcf.mscgva.ch/publicasmx/Tracking.asmx/GetRSSTrackingByContainerNumber?ContainerNumber=MSCU4727397'

; Read source from the url.
$sSource = InetRead($sUrl)

; Convert source to utf-8 string (8 = utf-8).
$sSource = BinaryToString($sSource, 8)

; Get the eta dates (3 = return array of global matches).
$aETA = StringRegExp($sSource, '(?is)title="Estimated Time of Arrival"&gt;ETA&lt;/a&gt;\s*:\s*(.*?)\s*&lt;', 3)

; Display the eta date.
If UBound($aETA) Then
    MsgBox(0, @ScriptName, $aETA[0])
EndIf

Получает дату ETA из HTML в источнике RSS / XML с использованием регулярных выражений.

StringRegExp Параметры (?is): i для нечувствительных и s для одной строки.Вокруг значения даты могут существовать пробелы, для их соответствия используется \s*.: является частью значения даты и соответствует.Это позволяет группе (.*?) получать только дату ETA.

$aETA содержит все даты ETA в массиве, хотя 1-й является $aETA[0], который показан в Msgbox ,Это дата ETA, которую вы упомянули, это дата вверху комментария.

0 голосов
/ 06 марта 2019

Исходные данные используют escape-последовательности вместо инкапсуляции CDATA.Регулярное выражение зависит от формата;следующие процессы в любом формате:

Пример списка <description> -tags (с использованием XML.au3 ), извлечение из содержимого HTML (с использованием IE.au3):

#include <Array.au3>
#include <IE.au3>
#include "XML.au3"

Global Const $g_iElement = 1, _; n-th XML <description> -tag.
             $g_iColCont = 3, _; n-th XML property column (tag content).
             $g_iTblCol  = 4, _; n-th HTML table col ("Final Discharge Port").
             $g_iTblRow  = 2;    n-th HTML table row (column's content).
Global Const $g_sFileTmp = @ScriptDir & '\rss_extract.html', _
             $g_sTplHtml = '<html>\n<head>\n<title>%s</title>\n</head>\n<body>\n%s\n</body>\n</html>\n', _
             $g_sRssUrl  = 'http://wcf.mscgva.ch/publicasmx/Tracking.asmx/GetRSSTrackingByContainerNumber?ContainerNumber=MSCU4727397', _
             $g_sRssXpt  = '//channel/item/description'

Global       $g_sRssTxt  = InetRead($g_sRssUrl)
Global       $g_aXmlNode, $g_aTable
Global       $g_oXmlDoc, $g_oXmlNode, $g_oIE, $g_oTable

$g_sRssTxt  = BinaryToString($g_sRssTxt)
$g_oXmlDoc  = _XML_CreateDOMDocument()
$g_oXmlDoc  = _XML_LoadXML($g_oXmlDoc, $g_sRssTxt)
$g_oXmlNode = _XML_SelectNodes($g_oXmlDoc, $g_sRssXpt)
$g_aXmlNode = _XML_Array_GetNodesProperties($g_oXmlNode)

_ArrayDisplay($g_aXmlNode)
FileWrite($g_sFileTmp, StringFormat($g_sTplHtml, $g_sFileTmp, $g_aXmlNode[$g_iElement][$g_iColCont]))

$g_oIE    = _IECreate($g_sFileTmp)
$g_oTable = _IETableGetCollection($g_oIE, 1)
$g_aTable = _IETableWriteToArray($g_oTable)

_ArrayDisplay($g_aTable)
MsgBox(Default, @ScriptName, $g_aTable[0][$g_iTblCol] & ' =' & @CRLF & @CRLF & $g_aTable[$g_iTblRow][$g_iTblCol])
_IEQuit($g_oIE)
FileDelete($g_sFileTmp)

$g_aTable[$g_iTblRow][$g_iTblCol] содержит HOUSTON US ETA : March 23, 2019.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...