Sonntag, April 5, 2020

Windows PowerShell analysieren lokale HTML-Datei

Möchte ich bauen ein array aus einem HTML-file mit PowerShell.

Verwende ich ein script, das download der HTML-Datei aus dem Mozilla Firefox-Developer Edition (ich bin Download der index-Datei) lokal und ich möchte analysieren, um den Wert der options-Elemente in der select-element, das die id auf id_country.

Ich habe empfohlen, die Verwendung von XPath für das, aber ich kann nicht herausfinden, wie analysieren Sie die Datei und erstellen Sie ein array vom Ergebnis. Vielleicht mit regex könnte ein workaround.

Die HTML-Datei ist hier :

http://pastebin.com/b8cShFLA

Und ich möchte alle Werte der Optionen, die Elemente hier:

<select aria-required="true" id="id_country" name="country" required="required">
   <option value="af">Afghanistan</option>
   <option value="al">Albania</option>
   <option value="dz">Algeria</option>
   <option value="as">American Samoa</option>
   <option value="ad">Andorra</option>

Ich bin ganz neu mit PowerShell, die ist, warum ich bin nicht wirklich bewusst, von anderen Lösungen, die ich vielleicht in der Lage sein zu verwenden. Ich bräuchte so etwas ganz schnell wie es ist Teil eines Paket-installer.

Grundsätzlich wird das script versuchen, um zu sehen, ob es sich um ein Installationsprogramm, die mit dem Gebietsschema auf dem computer des Benutzers und wenn nicht, wird standardmäßig auf Englisch, das ist, warum ich brauche, um die Werte aus dieser Liste aus, um zu überprüfen, die firefox dev verfügbaren Gebietsschemas.

Grüße,
O

InformationsquelleAutor anchnk | 2014-12-15

3 Kommentare

  1. 5

    Sehe ich nicht ein code-Beispiel, um zu reparieren, also werde ich eins machen.

    Wenn es eine remote-html, das ich verwenden würde Invoke-WebRequest, aber das funktioniert nicht allzu gut mit lokalen Dateien.

    Zur Analyse von lokalen Dateien, die ich würde empfehlen, mit HTML-Agility-Pack zum Parsen der HTML-Datei, und verwenden Sie dann xPath, um die Optionen, die Sie suchen. Ex.

    Add-Type -Path .\HTMLAgilityPack\HtmlAgilityPack.dll
    $url = (get-item .\b8cShFLA.html).FullName
    
    $doc = New-Object HtmlAgilityPack.HtmlDocument
    $doc.LoadHtml((get-content $url))
    
    #Create hashtable to store data in
    $langs = @{}
    
    $doc.DocumentNode.SelectSingleNode("//select[@name='country']").SelectNodes("option") | ForEach-Object {
        $short = $_.Attributes[0].Value
        $long = $_.NextSibling.InnerText
    
        #Store data in hashtable
        $langs[$short] = $long
    }
    
    $langs

    Ausgabe:

    Name                           Value
    ----                           -----
    rw                             Rwanda
    tv                             Tuvalu
    to                             Tonga
    pn                             Pitcairn
    bh                             Bahrain
    lc                             Saint Lucia   
  2. 5

    Wenn Sie mit PS 3.0 oder höher, können Sie die Vorteile von Invoke-WebRequest bei Seiten, die existieren, die auf der web. Wenn Sie in Betrieb sind gegen eine lokale Datei, es kann ein bisschen pingelig.

    Invoke-WebRequest gibt eine HtmlWebResponseObject mit einer Eigenschaft namens ParsedHtml. Dieses Objekt hat eine Methode namens getElementById, die wir nutzen können, da wir wissen, dass die id „id_country“ auf der select-tag. Von dort aus ist es eine einfache Sache zu Durchlaufen, die Optionen, tags und filter bis zur Rückgabe der Eigenschaften, die wir möchten… „Text“ und „Wert“.

    Beispiel unten gibt ein benutzerdefiniertes Objekt mit dem Namen des Landes und der Land code:

    Code:

    # I'm using your raw pastebin endpoint for this example
    $result = Invoke-WebRequest "http://pastebin.com/raw.php?i=b8cShFLA"
    
    # Only return specific properties from the elements you're looking for
    $countries = $result.ParsedHtml.getElementById("id_country") | 
        Where tagName -eq "option" | 
        Select -Property Text, Value
    
    # Country name and code are stored to this variable
    $countries

    Ausgabe:

    text                                                        value
    ----                                                        -----
    Afghanistan                                                 af
    Albania                                                     al
    Algeria                                                     dz
    American Samoa                                              as
    Andorra                                                     ad
    ...                                                         ...

    Dann können Sie den Namen des Landes und code als jede andere Eigenschaft auf powershell-Objekten.

    Als der web-Endpunkt, es klingt wie Sie, könnte dieses Skript so ändern, zeigen Sie auf das original Mozilla Seite, für die Sie extrahieren diese HTML aus?

Kostenlose Online-Tests