gundelputz
Goto Top

Wert aus Webseite auslesen

ein freundliches Hallo an alle,

ich möchte einen Wert(Zählerstand Drucker) aus der Webseites des Gerätes auslesen. Bis jetzt habe ich es aber nur geschaft die Webseite aus zu lesen.
$objWebClient = (New-Object System.Net.WebClient)
$objWebClient.DownloadString("http://10.2.38.79/cgi-bin/dynamic/printer/config/reports/devicestatistics.html")
es wird mir dann Zeile für Zeile angezeigt.
Speicher ich alles in einer txt so wird dort der Zeilenumbruch nicht mitgeschrieben.

1. Frage: Wie kann ich eine TXT oder CSV mit Zeilenumbuch speichern

in Zeile 125 steht der Wert(2425) den ich benötige
<TR><td><p align="left" style="margin-left: 40;">Gesamt</p></td><td><p> 2425 </p></td>

2. Frage: Wie kann ich den Wert auslesen denn ich benötige
Danke schon mal im vorraus

Content-ID: 207607

Url: https://administrator.de/forum/wert-aus-webseite-auslesen-207607.html

Ausgedruckt am: 23.12.2024 um 17:12 Uhr

Gundelputz
Gundelputz 06.06.2013 um 12:53:49 Uhr
Goto Top
vergesst die erste Frage. in einer csv siets gut aus. drauch mir als bloss den String aus Zeile 125 ein zu lesen und dann zerlegen. hier stosse ich aber an meine Grenzen.
ich übergebe den String also in eine Variable. anschliessend müsste ich dann mit Get-Matches den String auswerten. Leider finde ich im handbuch nichts passendes.

$zaehler = $string | Get-Matches "(??????)"

kann mir mal jemand den Befehl erklähren?
IceAge
IceAge 06.06.2013 aktualisiert um 13:05:58 Uhr
Goto Top
servus,

warum so kompliziert? könntest doch auch den Zähler mit smnpget auslesen..

Grüße Ice
Gundelputz
Gundelputz 06.06.2013 um 13:11:23 Uhr
Goto Top
Dies war mein ürsprunglicher Ansatz. Siehe "Wert aus Webseite auslesen".
Leider hat mir Da Lexmark, mit seinen neuen Farbsystemen, einen Strich durch die Rechnung gemacht. Da können die neuen OID's nich mehr mit smnpget abgrufen werden. Also nun dieser Weg. sit zwar etwas komplizierter aber nicht ganz unmöglich.
colinardo
colinardo 06.06.2013 aktualisiert um 13:37:06 Uhr
Goto Top
Hallo Gundelputz,
mit Regular Expressions und einer optimierten Funktion mit Group-Matching kannst du deinen gewünschten String extrahieren:

Function Get-Matches($Pattern,$groupNumber = 0) {begin { $regex = New-Object Regex($pattern) };process { foreach ($match in ($regex.Matches($_))) { ([Object[]]$match.Groups)[$groupNumber].Value }}}

$string = Get-Content "C:\DeineTextdatei.txt"  
$zaehler = $string | Get-Matches "Gesamt<\/p><\/td><td><p> ?(\d+) ?<\/p><\/td>" 1  

Grüße Uwe
Gundelputz
Gundelputz 06.06.2013 um 13:33:41 Uhr
Goto Top
Hi Uwe,
vom verstehen des Befehls binich noch weit entfehrnt aber habs natürlich gleich mal ausprobiert mit folgendem Ergebnis

PS H:\> Function Get-Matches($Pattern,$groupNumber = 0) {begin { $regex = New-Object Regex($pattern) };process { foreach ($match in ($regex.Matches($_))) { ([Object[]]$match.Groups)[$groupNumber].Value }}}
$string = Get-Content "C:\PS_proj\site1.txt"
$zaehler = $string | Get-Matches "$Textdatei | Get-Matches "Gesamt<\/p><\/td><td><p> (\d+) <\/p><\/td>" 1" 1

Der Operator "<" wird noch nicht unterstützt.
At line:3 char:92

kann es sein das PS einige Sonderzeichen als Operator erkennt(wie zB für den Beginn einer Variable) und wenn ja wie muss man es das schreiben das sies nicht mehr interpretiert wird?
colinardo
colinardo 06.06.2013 aktualisiert um 13:50:04 Uhr
Goto Top
Da hast du den Code zu schnell kopiert ... war noch ein Fehler drin ... komme gerade vom Holz machen , da hat man noch zu dicke Finger face-wink ... jetzt gehts

Nochmal zum Verständnis:

back-to-top1. Funktion für das Regular Expression Group-Matching
Diese Funktion braucht dich im Moment nicht sehr zu interessieren, diese behebt so manche Ungereimtheiten beim Umgang mit RegEx in der Powershell und erlaubt das einfache extrahieren von Teilen aus einem String. Aufgerufen wird die Funktion so $textInDemGesuchtWird | Get-Matches "[REGEX-Pattern]" [Regex-Groupnumber]
function Get-Matches($Pattern,$groupNumber = 0) {
  begin { $regex = New-Object Regex($pattern) }
  process { foreach ($match in ($regex.Matches($_))) { ([Object[]]$match.Groups)[$groupNumber].Value } }
}
Gundelputz
Gundelputz 06.06.2013 um 13:45:38 Uhr
Goto Top
bekomme trotzdem Fehlermeldung:

Der Operator "<" wird noch nicht unterstützt.
At line:14 char:92

Der Zeichenfolge, beginnend mit:
Bei Zeile:14 Zeichen:103

back-to-top$zaehler = $string | Get-Matches "$Textdatei | Get-Matches "Gesamt<\/p><\/td><td><p> (\d+) <\/p><\/td> <<<< " 1

fehlt der Terminator: ".
At line:17 char:1

hab den Cod mal angepasst bekomme dann andere Fehlermeldung

Function Get-Matches($Pattern,$groupNumber = 0)
{begin
{
$regex = New-Object Regex($pattern) };
process
{
foreach ($match in ($regex.Matches($_)))
{
([Object[]]$match.Groups)[$groupNumber].Value
}
}
}
$string = Get-Content "C:\PS_proj\site1.txt"
$zaehler = $string | Get-Matches "$Textdatei | Get-Matches "Gesamt"<"\/p"><"\/td"><"td"><"p">" (\d+) "<"\/p"><"\/td">"1"

Der Zeichenfolge, beginnend mit:
Bei Zeile:14 Zeichen:120

back-to-top$zaehler = $string | Get-Matches "$Textdatei | Get-Matches "Gesamt"<"\/p"><"\/td"><"td"><"p">" (\d+) "<"\/p"><"\/td">"1 <<<< "

fehlt der Terminator: ".
At line:14 char:122
colinardo
colinardo 06.06.2013 aktualisiert um 13:48:52 Uhr
Goto Top
Lade die Seite mal neu ich glaube dein Browser hat noch den alten Cache geladen ....das ist noch der alte Code
und bitte benutze doch die Formatierungs-Codes für Programm-Code hier im Forum; siehe FAQ
Gundelputz
Gundelputz 06.06.2013 um 14:01:18 Uhr
Goto Top
jetzt passt es Super. Sogar besser als erwartet.

PS H:\> Function Get-Matches($Pattern,$groupNumber = 0)
{begin
{
$regex = New-Object Regex($pattern) };
process
{
foreach ($match in ($regex.Matches($_)))
{
([Object[]]$match.Groups)[$groupNumber].Value
}
}
}
$string = Get-Content "C:\PS_proj\site1.txt"
$zaehler = $string | Get-Matches "Gesamt<\/p><\/td><td><p> ?(\d+) ?<\/p><\/td>" 1


_______________________________________________________________________________________________________________________________________________
PS H:\> Function Get-Matches($Pattern,$groupNumber = 0)
{begin
{
$regex = New-Object Regex($pattern) };
process
{
foreach ($match in ($regex.Matches($_)))
{
([Object[]]$match.Groups)[$groupNumber].Value
}
}
}
$string = Get-Content "C:\PS_proj\site1.txt"
$zaehler = $string | Get-Matches "Gesamt<\/p><\/td><td><p> ?(\d+) ?<\/p><\/td>" 1
$zaehler

2340
1103
1322

wie du sehen kannst spuckt er mir genau die drei Werte aus die ich haben will. mir ist jetzt klar das es das Suchergebnis drei mal giebt. Nun stelllen sich mir gleich wieder ein paar Fragen.
der Syntax ?(\d+) wie darf ich denn verstehen oder besser gesagt wo finde ich im Handbuch die Erklärung dazu?
Die andere Frage die ich mir stelle ist: wird das ergebnis 3x nach einnander ausgegeben? Und wie fange ich diese in seperaten Variablen ab?

So viele Fragen und noch soviel zu lehrnen und zu verstehen?
Wieder ein mal bin ich dir zu Dank verpflichtet.
colinardo
colinardo 06.06.2013 aktualisiert um 14:12:37 Uhr
Goto Top
Zitat von @Gundelputz:
der Syntax ?(\d+) wie darf ich denn verstehen oder besser gesagt wo finde ich im Handbuch die Erklärung dazu?
Das hier zu erläutern würde den Rahmen sprengen, zu Regular Expressions gibt es genug Tutorials im Netz z.B. hier
Zur Erläuterung [Leerzeichen]?(\d+)[Leerzeichen]? ,würde man es ausschreiben sähe das so aus:

6cd5a913b1955e112e68dc05682f0580

Die andere Frage die ich mir stelle ist: wird das ergebnis 3x nach einnander ausgegeben? Und wie fange ich diese in seperaten
Variablen ab?
dazu muss das RegEx entsprechend dem Code angepasst werden, damit jeweils nur die entsprechende Stelle gematcht wird, das kann ich jetzt aber nur raten da dein HTML-Code hier nicht steht.
Ein gutes Tool zum Anfangen mit RegEx-Patterns, ist das hier -> http://www.regexbuddy.com/
Gundelputz
Gundelputz 06.06.2013 um 14:39:34 Uhr
Goto Top
OK
mir raucht schon der Kopf.
hab jetzt mal zu Testzwecken einfach die Ausgabe in eine TXT geleitet.
hier stehen jetzt die Werte seperat in einer Zeile was mich zu der Annahme bringt dasdie werte nach ein nander ausgegeben werden.
Um jetzt ers mal weiter zu kommen noch eine(für heute hoffentlich) letzte Frage.
Wie kann ich die einzelnen Zeilen der txt-datei auslesen und in sep. Variablen speichern.
colinardo
colinardo 06.06.2013 aktualisiert um 14:55:42 Uhr
Goto Top
Leite doch die Ausgabe nicht in eine Textdatei sondern mach das direkt mit der Variable $zaehler
z.B. so (Zur Info: `n ist ein Zeilenumbruch)
$var1 = $zaehler.split("`n")  
$var2 = $zaehler.split("`n")[1]  
$var3 = $zaehler.split("`n")[2]  

tu langsam zu viel auf einmal macht dich kirre...
face-wink Uwe
Gundelputz
Gundelputz 06.06.2013 um 14:59:42 Uhr
Goto Top
sah super aus
aber offennsichtlicht wird .split nich unterstüzt

Fehler beim Aufrufen der Methode, da [System.Object[]] keine Methode mit dem Namen "split" enthält.
Bei C:\PS_proj\website_auswerten.ps1:18 Zeichen:23

back-to-top$var1 = $zaehler.split <<<< ("`n")

+ CategoryInfo : InvalidOperation: (split:String) , RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
colinardo
colinardo 06.06.2013 um 15:05:53 Uhr
Goto Top
ach,.... ist ja schon ein Array dann geht's so:

$var1 = $zaehler
$var2 = $zaehler[1]
usw.
Gundelputz
Gundelputz 06.06.2013 um 15:10:59 Uhr
Goto Top
so einfach kann es sein.
hab mir schon gedacht das es was mit nem Array zu tun hat. aber nicht das es schon eins ist. wollte gerade ein draus machen und bin gescheitert.

so. Jetzt müsste ich aber einiges zusammen haben um ne Weile beschäftigt zu sein.

Vielen Dank für deine schnelle und kompetente Hilfe.
colinardo
colinardo 06.06.2013 aktualisiert um 15:19:17 Uhr
Goto Top
gerne, noch zu Arrays - die erstellt man so:

Leeres Array erstellen
$array = @()

Array schon mit Werten erstellen
$array = @("wert1","wert2,"wert3")  

Zu einem Array einen Eintrag hinzufügen
$array += "NeuerWert"