Per Batch bestimmten Text aus mehreren .html Dateien gleichzeitig auslesen
Hallo und schönen Sonntag,
ich habe hier folgendes Problem:
Ich habe einen Ordner mit über 1000 .html Dateien mit verschiedenen Dateinamen bei denen ich in jeder Datei nach einem bestimmten Tag suchen muss:
anschließend müsste ich nur den Teil " hier steht belieber Text " ausgeben und nach einer weiteren HTML-Codestelle im selben .html Dokument suchen:
Hier interessiert nur " 30,00 " also der Betrag in EUR.
In der Ausgabe soll also stehen " hier steht beliebiger Text " dann ein " ; " damit ich die Werte einfach in Excel in 2 Spalten importieren kann, und dann noch " 30,00 ".
Ich hab` jetzt schon mal versucht ein Script, dass hier im Forum funktioniert hat folgendermaßen anzupassen:
Hiermit wollte ich das Tag mit der meta description auslesen, aber das Script bricht mit folgender Meldung ab:
Script:
Ich wäre euch sehr, sehr dankbar, wenn Ihr das Skript zum laufen bringen würdet, da ansonten alle Infos von Hand aus den über 1000 .html Dateien herauskopiert werden müssen.
Vielen Dank schonmal,
nostream
ich habe hier folgendes Problem:
Ich habe einen Ordner mit über 1000 .html Dateien mit verschiedenen Dateinamen bei denen ich in jeder Datei nach einem bestimmten Tag suchen muss:
<META NAME="description" CONTENT=" hier steht beliebiger Text ">
anschließend müsste ich nur den Teil " hier steht belieber Text " ausgeben und nach einer weiteren HTML-Codestelle im selben .html Dokument suchen:
class="artikelpreis" id="preis" style="font-weight:bold;">30,00 €</span><br>
Hier interessiert nur " 30,00 " also der Betrag in EUR.
In der Ausgabe soll also stehen " hier steht beliebiger Text " dann ein " ; " damit ich die Werte einfach in Excel in 2 Spalten importieren kann, und dann noch " 30,00 ".
Ich hab` jetzt schon mal versucht ein Script, dass hier im Forum funktioniert hat folgendermaßen anzupassen:
@echo off & setlocal
set "Verzeichnis=C:\Dokumente und Einstellungen\nostream\Eigene Dateien\MeineSite\MeinOrdner"
set "Typ=html"
set "Liste=C:\Dokumente und Einstellungen\nostream\Eigene Dateien\MeineSite\Liste.txt"
if exist "%Liste%" del "%Liste%"
for %%i in ("%Verzeichnis%\*.%Typ%") do type "%%i"|findstr /i /c:"\* <META NAME="description" CONTENT= * >\*">nul && >>"%Liste%" echo %%i
Hiermit wollte ich das Tag mit der meta description auslesen, aber das Script bricht mit folgender Meldung ab:
Script:
...\Batch.vbs
Zeile: 1
Zeichen: 1
Fehler: Ungültiges Zeichen
Code: 800A0408
Quelle: Kompilierungsfehler in Microsoft VBScript
Ich wäre euch sehr, sehr dankbar, wenn Ihr das Skript zum laufen bringen würdet, da ansonten alle Infos von Hand aus den über 1000 .html Dateien herauskopiert werden müssen.
Vielen Dank schonmal,
nostream
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 119244
Url: https://administrator.de/contentid/119244
Ausgedruckt am: 19.11.2024 um 20:11 Uhr
16 Kommentare
Neuester Kommentar
Hallo nostream!
Wenn Du Batch-Code schreibst, dann musst Du der Datei den Namen *.bat oder *.cmd geben.
Gruß Dieter
Wenn Du Batch-Code schreibst, dann musst Du der Datei den Namen *.bat oder *.cmd geben.
Gruß Dieter
Hallo nostream!
Einen einheitlichen Aufbau der fraglichen Zeilen wie in Deinem Beispiel und nur je eine "passende" Zeile vorausgesetzt, könnte es mit folgendem Batch gehen:
Grüße
bastla
Einen einheitlichen Aufbau der fraglichen Zeilen wie in Deinem Beispiel und nur je eine "passende" Zeile vorausgesetzt, könnte es mit folgendem Batch gehen:
@echo off & setlocal enabledelayedexpansion
set "Verzeichnis=C:\Dokumente und Einstellungen\nostream\Eigene Dateien\MeineSite\MeinOrdner"
set "Typ=html"
set "Liste=C:\Dokumente und Einstellungen\nostream\Eigene Dateien\MeineSite\Liste.txt"
if exist "%Liste%" del "%Liste%"
for %%i in ("%Verzeichnis%\*.%Typ%") do (
for /f "tokens=3 delims=<=>" %%a in ('findstr /i /c:"META NAME=\"description\" CONTENT=" "%%i"') do set "Zeile=%%a"
for /f "tokens=5 delims=<=>&" %%a in ('findstr /i /c:"class=\"artikelpreis\"" "%%i"') do echo !Zeile!;%%a
)>>"%Liste%"
bastla
Hallo nostream!
wären bei Verwendung der Trennzeichen "<", "=" und ">" folgende "tokens" entstanden (die Trennzeichen selbst werden natürlich weggelassen):
Da die Zeilen in Deinen "Echt"-Dateien offensichtlich noch einen zusätzlichen Bestandteil enthalten, habe ich eben geraten, dass der gesuchte Text als Teil 4 zu finden ist ...
In der Variablen %Zeile% (bei Verwendung von "delayedExpansion" als !Zeile! zu schreiben) wird die Ausgabezeile zusammengesetzt und kann dann am Ende der Schleife ausgegeben werden - damit sollte auch klar sein, wie weitere Felder eingebaut werden können. Die Zerlegung kann wieder nach dem gleichen Muster wie oben erfolgen - am Beispiel der Zeile
sähe das so aus:
Für die "navi"-Zeile mit mehreren verwertbaren Teilen kannst Du auch mehrere "tokens" angeben, etwa
Auf dieser Basis könntest Du versuchen, die gewünschte Ausgabezeile zusammenzusetzen.
Grüße
bastla
Wieso musste denn der Wert hier von "3" auf "4" geändert werden?
Mit der "token"-Nr wird festgelegt, welcher Teil einer Zeile verwendet werden soll, wobei die einzelnen Teile durch die als "delims" angegebenen Zeichen getrennt sind. Lt Deinem Beispiel<META NAME="description" CONTENT=" hier steht beliebiger Text ">
META NAME
"description" CONTENT
" hier steht beliebiger Text "
1. Wozu der Backslash \ nach dem "span class=" ?
Eigentlich steht der Backslash vor dem folgenden Anführungszeichen, da dieses für die Verwendung mit "findstr" als "gewöhnliches, zu suchendes Zeichen" gekennzeichnet werden muss (dies gilt auch zB für den "\" selbst, der dann "\\" zu schreiben ist, oder für ".", "$" oder "^").2. Reicht es das " ; " in der 9ten Zeile einmal auszugeben?
Nein; wenn Du mehrere Felder in Deinem auszugebenden Datensatz hast, ist auch die entsprechende Anzahl an ";" erforderlich. In der angesprochenen Zeile 9 habe ich nur eine Abkürzung genommen; besser verständlich wäre folgende auf 2 Zeilen verteilte Schreibweise:for /f "tokens=5 delims=<=>&" %%a in ('findstr /i /c:"class=\"artikelpreis\"" "%%i"') do set "Zeile=!Zeile!;%%a"
echo !Zeile!
<title> " hier steht der Titel "</title>
for /f "tokens=2 delims=<>" %%a in ('findstr /i /c:"<title>" "%%i"') do set "Zeile=!Zeile!;%%a"
for /f "tokens=8,12,16,20 delims=<>" %%a in ('findstr /i /c:"<p class=\"navi\"" "%%i"') do set "Zeile=!Zeile!;%%a;%%b;%%c;%%d"
Grüße
bastla
Hallo nostream!
Auf jeden Fall muss es beim ersten Feld nur heißen:
<code type="plain>... do set Zeile=%%a
damit für jede Datei eine neue Zeile erstellt wird.
Für die Artikelnummer würde auf Basis der oben von Dir geposteten Zeile
zB
funktionieren (mit ":" anstatt "=" als Trennzeichen - die Aufteilung "span class" und "artikelnummer" bringt ja nix).
Grüße
bastla
Leider klappt die Ausgabe nicht so ganz.
... ließe sich doch sicher noch etwas konkretisieren (etwa mit Beispielen für Ausgangsdaten / Ergebnis), da, wie es aussieht, Deine oben geposteten Musterzeilen nicht ganz dem tatsächlichen Aufbau entsprechen ...Auf jeden Fall muss es beim ersten Feld nur heißen:
<code type="plain>... do set Zeile=%%a
damit für jede Datei eine neue Zeile erstellt wird.
Für die Artikelnummer würde auf Basis der oben von Dir geposteten Zeile
<span class="artikelnummer">ArtikelNr.: XXXX123456</span>
for /f "tokens=3 delims=<:>" %%a in ('findstr /i /c:"span class=\"artikelnummer\"" "%%i"') do set "Zeile=!Zeile!;%%a"
Grüße
bastla
Hallo nostream!
Grüße
bastla
... da ich mir noch nicht so ganz sicher bin, was jetzt alles als "tokens" gezählt wird. Weder das zählen der Schritte noch der einzelnen "delims" führte bei den Abfragen zum gewünschten Ergebnis. Ich gehe momentan davon aus, dass wenn z. B. in der Zeile ein <br> steht, dieses als ein token zählen müsste. Schwieriger ist`s, wenn z. B. wie bei der span class erst ein "<" steht, dann weitere delims, die z. B. nur ein Zeichen zusätzlich enthalten wie "</span> und was dann je genau alles ein token darstellt?
Mehrere aufeinander folgende "Delimiter"-Zeichen werden nur als ein einziges Trennzeichen interpretiert, daher wäre in Deinem Beispiel mit "delims=<>/" (Reihenfolge egal) das "span" ein "Token", während sich zwischen "<" und "/" nichts befindet, also auch kein "Token" (was manchmal nachteilig ist, da es ja zB in CSV-Dateien tatsächlich leere Felder zwischen 2 Trennzeichen geben kann)Grüße
bastla
Hallo nostream!
Schematisch könnte die gewünschte Vorgangsweise etwa so umgesetzt werden:
Mit der Zeile 2 wird der alte Inhalt (von der vorigen Datei) der Variablen Preis und damit die Variable selbst gelöscht, sodass diese in Zeile 4 mit "if defined" geprüft werden kann. "Defined" ist sie nur, wenn sie vorher in Zeile 3 einen Wert (aus Token 12) erhalten hat. Token 12 zuerst zu prüfen ist nötig, da es Token 5 immer gibt, wenn ein Token 12 vorhanden ist.
Grüße
bastla
Schematisch könnte die gewünschte Vorgangsweise etwa so umgesetzt werden:
...
set "Preis="
for /f "tokens=12 delims=<=>" %%a in ('findstr /i /c:"class=\"artikelpreis\"" "%%i"') do set "Preis=%%a"
if not defined Preis for /f "tokens=5 delims=<=>" %%a in ('findstr /i /c:"class=\"artikelpreis\"" "%%i"') do set "Preis=%%a"
echo !Zeile!;!Preis!
)>>"%Liste%"
Grüße
bastla