Wert aus Quelltext einer HP lesen
Hallo zusammen!
Wünsche erstmal ein frohes neues Jahr.
Kurze Infos zu mir da ich neu in diesem Forum bin:
Frank, 26 Jahre, komme aus Nürnberg, arbeite in München als Consultant für BMW und habe eingentlich nichts mit Programmierung oder Ähnlichem am Hut.
Beschäftige mich seit Anfang meines Weihnachtsurlaubs mit der Batchprogrammierung. Habe zuvor im Techniker ein Jahr mit C# arbeiten müssen.
Mein Ziel sind einfache Arbeitserleichterungen für den beruflichen oder privaten Alltag.
Ich möchte ein Batch erstellen der eine Hompage runterläd, daraus einen Wert ausliest und diesen in einer .txt speichert damit ich diese dann in Excel importieren kann.
Der .txt import zu excel war kein Problem.
Wenn ich die Hompage händisch in Firefox öffne und "speichern unter" txt wähle klappt das auslesen der Werte wunderbar.
Hierfür nutze ich folgenden Code:
Jetzt möchte ich das runterladen automatisieren und habe dazu ein VBScript gefunden und ein wenig auf meine Anforderungen abgeändert.
Es funktioniert auch einwandfrei, jedoch gibt es den Quelltext der HP aus und den bekomme ich mit meinem bisherigen Code nicht verabeitet.
Egal was ich probiere um an die Werte zu kommen, es kommt immer nur ein Kauderwelsch dabei raus...
Ich hoffe ihr könnt mir helfen.
Grüße Frank
Wünsche erstmal ein frohes neues Jahr.
Kurze Infos zu mir da ich neu in diesem Forum bin:
Frank, 26 Jahre, komme aus Nürnberg, arbeite in München als Consultant für BMW und habe eingentlich nichts mit Programmierung oder Ähnlichem am Hut.
Beschäftige mich seit Anfang meines Weihnachtsurlaubs mit der Batchprogrammierung. Habe zuvor im Techniker ein Jahr mit C# arbeiten müssen.
Mein Ziel sind einfache Arbeitserleichterungen für den beruflichen oder privaten Alltag.
Ich möchte ein Batch erstellen der eine Hompage runterläd, daraus einen Wert ausliest und diesen in einer .txt speichert damit ich diese dann in Excel importieren kann.
Der .txt import zu excel war kein Problem.
Wenn ich die Hompage händisch in Firefox öffne und "speichern unter" txt wähle klappt das auslesen der Werte wunderbar.
Hierfür nutze ich folgenden Code:
for /f %%i in ('Find /n "SUCHBEGRIFF" LINK') do Set LineNo=%%i
set LineNo=%LineNo:~1,4%
set /a LineNo = %LineNo%+7
set "line="
set /a LineNo-=1
for /f %%a in ('more/e +%LineNo% ^< LINK') do (
if not defined line set "line=%%a"
)
set line=%line:~0,7%
set euro=%line%
Jetzt möchte ich das runterladen automatisieren und habe dazu ein VBScript gefunden und ein wenig auf meine Anforderungen abgeändert.
Es funktioniert auch einwandfrei, jedoch gibt es den Quelltext der HP aus und den bekomme ich mit meinem bisherigen Code nicht verabeitet.
Egal was ich probiere um an die Werte zu kommen, es kommt immer nur ein Kauderwelsch dabei raus...
Ich hoffe ihr könnt mir helfen.
Grüße Frank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 359774
Url: https://administrator.de/contentid/359774
Ausgedruckt am: 25.11.2024 um 01:11 Uhr
11 Kommentare
Neuester Kommentar
Servus Frank,
also wenn es dir daraum geht den reinen Text der Webseite ohne HTML-Tags zu bekommen da gibt es so einige Möglichkeiten, hier ein paar davon:
Direkt in Excel mit VBA-Makro
Oder als Powershell Einzeiler:
usw.
Aber normalerweise ist auch das Extrahieren aus dem HTML-Code mit etwas Regular Expressions kein wirkliches Problem, wenn du diesen Ausschnitt den du suchst hier postest kann ich dir auch gerne den genauen Weg zu deinem gewünschten String hier posten.
Grüße Uwe
also wenn es dir daraum geht den reinen Text der Webseite ohne HTML-Tags zu bekommen da gibt es so einige Möglichkeiten, hier ein paar davon:
Direkt in Excel mit VBA-Makro
Sub GetWebSitePlainText()
Const URL = "https://administrator.de"
dim objhttp as object, dom as object
Set objhttp = CreateObject("Microsoft.XMLHTTP")
Set dom = CreateObject("htmlfile")
With objhttp
.Open "GET", URL, False
.send
If .Status = 200 Then
dom.write .responseText
MsgBox dom.body.innerText
End If
End With
End Sub
(iwr -Uri 'https://administrator.de').ParsedHtml.body.innerText
Aber normalerweise ist auch das Extrahieren aus dem HTML-Code mit etwas Regular Expressions kein wirkliches Problem, wenn du diesen Ausschnitt den du suchst hier postest kann ich dir auch gerne den genauen Weg zu deinem gewünschten String hier posten.
Grüße Uwe
Kein Problem, schick mir einfach mal den Link zur betreffenden Website dann habe ich den besseren Zusammenhang und extrahiere dir den Wert direkt per Regex, denn das mit den Zeilen ist wie du siehst mies und unzuverlässig.
Hier ist mal ein einfaches Beispiel für den Goldpreis von "http://www.goldpreis.de", das du direkt in der CMD ausführen kannst (Bei Platzierung in einer Batch ist das % Zeichen zu verdoppeln).
Hier ist mal ein einfaches Beispiel für den Goldpreis von "http://www.goldpreis.de", das du direkt in der CMD ausführen kannst (Bei Platzierung in einer Batch ist das % Zeichen zu verdoppeln).
powershell -Executionpolicy Bypass -NoProfile -Command "(iwr -Uri 'https://www.goldpreis.de/').ParsedHtml.getElementsByClassName('au_gold_usd_o') | %{$_.innerText.Trim()}"
Gut, für die Consors-Seite brauchst du hier ausnahmsweise diesmal nur die URL und den Klassennamen entsprechend austauschen da es auch hier nur ein Element mit dem jeweiligen Klassennamen auf der Seite gibt:
Die Seite wird mit iwr = Invoke-Webrequest heruntergeladen und in ein Objekt geladen von dem wir die Eigenschaft ParsedHtml abrufen und aus diesem die Methode getElementsByClassName('KLASSENNAME') aufrufen welche die Knoten mit dem entsprechenden Klassennamen ausfiltert. Dann wird per Foreach-Schleife (%{}) die Eigenschaft innerText des Knotens ($_ ist die Pipelinevariable) ausgelesen und eventuelle Leerzeichen am Anfang oder Ende des Strings entfernt.
Hoffe das bringt etwas Licht ins Dunkel. Leider kann ich dir hier keinen Grundkurs Powershell geben, aber vielleicht einen Anreiz sich die Skript-Sprache näher anzuschauen
Wünsche Dir weiterhin viel Erfolg!
Grüße Uwe
powershell -Executionpolicy Bypass -NoProfile -Command "(iwr -Uri 'https://www.consorsbank.de/Wertpapierhandel/Snapshot/id1326189').ParsedHtml.getElementsByClassName('price') | %{$_.innerText.Trim()}"
Will ja schließlich auch verstehen was da passiert
Nun es passiert folgendes:Die Seite wird mit iwr = Invoke-Webrequest heruntergeladen und in ein Objekt geladen von dem wir die Eigenschaft ParsedHtml abrufen und aus diesem die Methode getElementsByClassName('KLASSENNAME') aufrufen welche die Knoten mit dem entsprechenden Klassennamen ausfiltert. Dann wird per Foreach-Schleife (%{}) die Eigenschaft innerText des Knotens ($_ ist die Pipelinevariable) ausgelesen und eventuelle Leerzeichen am Anfang oder Ende des Strings entfernt.
Hoffe das bringt etwas Licht ins Dunkel. Leider kann ich dir hier keinen Grundkurs Powershell geben, aber vielleicht einen Anreiz sich die Skript-Sprache näher anzuschauen
Wünsche Dir weiterhin viel Erfolg!
Grüße Uwe
Hallo nochmal,
da gibt es mehrere praktische Ansätze. Entweder man kennt die absolute Position (die man manuell ermitteln kann) und nimmt dann den Index der Auflistung, oder man sucht erst nach dem BTC/USD Knoten und referenziert dann den nächsten Nachbarknoten (nextSibling), was hier bspw. mein Weg wäre:
In deinem Fall hier kommen noch die Grundlagen des gesamten HTML-DOM-Object hinzu welche Invoke-Webrequest mit der Eigenschaft parsedHtml bereitgestellt werden. Überfordere dich nicht, lerne es Schritt für Schritt, denn sonst verlierst du den Überblick, Quereinstieg schön und gut aber Grundlagen sind hier Pflichtprogramm und natürlich üben, üben, üben.
Hast du einmal den Bogen raus möchtest du Batch nicht mehr sehen, glaubs mir.
Ein guter Anfang für die Powershell Grundlagen:
Powershell Grundlagen- und Praxisvermittlung:
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Grüße Uwe
da gibt es mehrere praktische Ansätze. Entweder man kennt die absolute Position (die man manuell ermitteln kann) und nimmt dann den Index der Auflistung, oder man sucht erst nach dem BTC/USD Knoten und referenziert dann den nächsten Nachbarknoten (nextSibling), was hier bspw. mein Weg wäre:
powershell -ExecutionPolicy ByPass -NoProfile -Command "(iwr -Uri 'https://www.bitfinex.com/stats').ParsedHtml.getElementsByClassName('col-info') | ?{$_.innerText -eq 'BTC/USD'} | select -First 1 | %{$_.nextSibling.innerText.trim()}"
Leider finde ich auch keine HP die mir die verfügbaren Funktionen in Powershell erklärt.
Das ist auch fast unmöglich, denn Powershell unterstützt das gesamte Arsenal des .NET Frameworks. D.h. alles was du auch in C#, VB.Net etc. machen kannst kannst du auch mit der Powershell erledigen.In deinem Fall hier kommen noch die Grundlagen des gesamten HTML-DOM-Object hinzu welche Invoke-Webrequest mit der Eigenschaft parsedHtml bereitgestellt werden. Überfordere dich nicht, lerne es Schritt für Schritt, denn sonst verlierst du den Überblick, Quereinstieg schön und gut aber Grundlagen sind hier Pflichtprogramm und natürlich üben, üben, üben.
Hast du einmal den Bogen raus möchtest du Batch nicht mehr sehen, glaubs mir.
Ein guter Anfang für die Powershell Grundlagen:
Powershell Grundlagen- und Praxisvermittlung:
- https://docs.microsoft.com/en-us/powershell/
- http://www.powershellpraxis.de/index.php/die-drei-wichtigsten-cmdlets
- http://www.msxfaq.de/code/powershell/powershell.htm
- PowerShell for Runaways - Part I
- PowerShell For Runaways - Part II
- http://powershell.com/cs/
- http://powershell.com/cs/media/13/default.aspx
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Grüße Uwe
Mit dem -match Operator und etwas Regular Expressions z.B.
Das
Alternativ kann man auch die Werte in einem Array ablegen und dann im Where-Object mit dem -in Operator prüfen ob ein Wert mit dem Array übereinstimmt.
-edit- Tippfehler korrigiert
powershell -ExecutionPolicy ByPass -NoProfile -Command "(iwr -Uri 'https://www.bitfinex.com/stats').ParsedHtml.getElementsByClassName('col-info') | ?{$_.innerText -match '^(IOTA/USD|BTC/USD|XRP/USD)$'} | Select -First 3 | %{$_.innerText + ':' + $_.nextSibling.innerText.trim()}"
Select -First 3
hier weil unten auf der Seite die Werte nochmal erscheinen.Alternativ kann man auch die Werte in einem Array ablegen und dann im Where-Object mit dem -in Operator prüfen ob ein Wert mit dem Array übereinstimmt.
-edit- Tippfehler korrigiert