HTML Wie unter Windows einen String auf einer Website suchen?

Techflaws.org

Ensign
Registriert
Aug. 2009
Beiträge
253
Es soll kurzfristig eine Liste mit in den Filialen verbauter Hardware erstellt werden, die über die https Website des Herstellers abgefragt werden kann. Dazu muss in Chrome/Edge/Firefox eine URL aufgerufen werden und beim Vorhandensein eines bestimmtem Strings im Text der Website JA in eine lokale Textdatei geschrieben werden. Womit lässt sich das am einfachsten bewerkstelligen?
 
Mit einer Programmiersprache Deiner Wahl und Parsing.
 
  • Gefällt mir
Reaktionen: BeBur
Ich würde es mit Python angehen:
Mit den beiden Libaries request & beautifulsoup4

Wenn Programmieren nicht deine Stärke ist könntest du es auch mit der Software KNIME und der Erweiterung Palladian versuchen :)

VG FaMe
 
Mit Windows Boardmitteln geht das mit Batch oder Powershell und curl.
Oder etwas mehr Flexibilität gibt es mit Node.js und Javascript.
Usw...
 
Techflaws.org schrieb:
Womit lässt sich das am einfachsten bewerkstelligen?

Wenn Bash/Sh verfügbar ist und die typischen Bordmittel geht es einfach. Für Windows/PowerShell gibts sicherlich vergleichbare Befehle. Da kenn ich mich aber nicht aus.
curl https://example.com/ | grep -q "asking for permission" && echo "JA" >> log.txt
Hier mal beispielhaft für example.com und den Text "aksing for permission", der auf der Seite auftaucht. Wenn dein String durch HTML-Tags unterbrochen ist, wird es komplexer und du brauchst evtl. einen Parser oder eine andere Technik um den reinen Text aus der Seite zu extrahieren. Das hier ist die absolute Billoversion.
 
  • Gefällt mir
Reaktionen: usernamehere und Cool Master
Das hat mir ChatGPT ausgespuckt für die PowerShell (schreibt aber nicht in eine Datei):
Code:
# URL der HTML-Seite
$url = "https://www.example.com"

# Text, den du überprüfen möchtest
$desiredText = "gewünschter Text"

# HTML-Inhalt der Seite abrufen
$htmlContent = Invoke-WebRequest -Uri $url

# Überprüfen, ob der gewünschte Text im HTML-Inhalt enthalten ist
if ($htmlContent.Content -match $desiredText) {
    Write-Output "Die HTML-Seite enthält den gewünschten Text."
} else {
    Write-Output "Die HTML-Seite enthält nicht den gewünschten Text."
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Simon#G
Raijin schrieb:
Webseite mit curl ziehen, parsen, Log schreiben
Als Ergänzung:
Wenn man dann noch grep hin zu nimmt, hat mans ja fast schon:
curl -s myurl | grep -q "ABC" && echo "JA" > mytextfile.txt
(für myurl natürlich die richtige Adresse eintragen und für JA die gesuchte Zeichenkette; regexp möglich)
Ergänzung ()

Oh. Da war jemand minimal schneller :-)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Simon#G, Cool Master und Raijin
tollertyp schrieb:
Das hat mir ChatGPT ausgespuckt für die PowerShell (schreibt aber nicht in eine Datei):
Danke, mit einer beliebigen URL funktioniert das sogar fast. Suche ich auf unserer Firmenwebseite nach der dort angegebenen Telefonnummer, gibt es einen Treffer; ändere ich eine Ziffer, so dass die Nummer nicht übereinstimmt, keinen, gut! Suche ich unsere Firmenseite allerdings nach dem gefragten String - A ab, kommt auch die Meldung, der sei gefunden worden, obwohl er nicht vorkommt, nicht einmal im Quelltext.

Noch problematischer scheint zu sein, dass die URL des Kunden auf .aspx mit ein paar angehängten Parametern endet. Führe ich das Skript mit dieser URL durch, kommt eine Fehlermeldung, in der die URL verhackstückt ist:

Invoke-WebRequest : Server Error in '/wwwroot' Application.
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
wwwroot.custNet.Maintenance.Stores.OrganizationStoreConfiguration.createFloorsTable(DataTable pTable) in C:\Users\lokaal\Documents\GitHub\retail-custnet-maintenance\custMaintenance\custNet\Maintenance\Stores\OrganizationStoreConfigurat
ion.aspx.cs:156
wwwroot.custNet.Maintenance.Stores.OrganizationStoreConfiguration.Page_Load(Object sender, EventArgs e) in C:\Users\
lokaal\Documents\GitHub\retail-custnet-maintenance\custMaintenance\custNet\Maintenance\Stores\OrganizationStoreConfigur
ation.aspx.cs:71
System.EventHandler.Invoke(Object sender, EventArgs e) +0
System.Web.UI.Control.OnLoad(EventArgs e) +95
System.Web.UI.Control.LoadRecursive() +59
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
+678
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.7.4081.0
In C:\test\scrape.ps1:8 Zeichen:16
+ $htmlContent = Invoke-WebRequest -Uri $url
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc
eption
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
Dann musst du evtl Zeichen escapen?
Enthält die URL bzw. die Paramter denn Gänsefüßchen?
Code:
https://www.google.com/search?q="Hallo"
vs
Code:
https://www.google.com/search?q=%22Hallo%22
 
Good find!

Im Browser ja, aber nicht in einem privaten Fenster, da kommt dann auch die Fehlermeldung. Es scheint, als müsse man in dem Browser-Fenster eingeloggt sein, um diese Unterseite aufrufen zu können. Bin ich also in Chrome auf der Seite eingeloggt und kopiere den Link auf die gewünschte Unterseite, kann ich sie in Firefox nicht aufrufen. Ich muss mich erst in Firefox auch noch einloggen und dann funktioniert der Link.

Evtl. wird da ein Cookie für eine Session oder so gesetzt, das beim Zugriff über die Powershell fehlt.
 
Gewisse Informationen kann man bei solchen Sachen auch mitgeben... Du müsstest, falls es ein Cookie ist, das vorher halt "extrahieren".

Also mit PowerShell könnte eine Erweiterung für ein Session-Cookie so aussehen:
Code:
# Cookie-Daten
$cookieData = @{
    Name = "cookieName"
    Value = "cookieValue"
}

# Anfrage an die Webseite senden und Cookie speichern
$response = Invoke-WebRequest -Uri $url -SessionVariable session -WebSession $cookieData
 
  • Gefällt mir
Reaktionen: Raijin
Eine grundsätzliche Anmerkung dazu: Du solltest den Zyklus für die Aktualisierung nicht zu eng gestalten. Wenn dein scraper zu häufig bei der Webseite anklopft und womöglich auch Daten ausliest, die in der robots.txt eigentlich nicht "erlaubt" sind, kann das dem Betreiber der Webseite übel aufstoßen und wenn's ihm zu bunt wird, sperrt er eventuell sogar den Account. Sporadisches Auslesen ist halb so wild, aber .. .. was weiß ich.. sekündliche Preisaktualisierungen oder sowas können unerwünscht sein.
 
  • Gefällt mir
Reaktionen: andy_m4
Aus dem einleitenden Satz dieses Threads geht für mich nichts hervor, was für irgendeinen Zyklus spricht.
 
Zurück
Oben