Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
cfour
- Beiträge: 5
- Registriert: 24.08.2013 01:02:11
Beitrag
von cfour » 24.08.2013 01:06:28
Hallo
ich steh etwas auf dem Schlauch...es ist wahrscheinlich recht einfach zu lösen.
Code: Alles auswählen
TMP=`echo $HTML | \
tr "\t\r\n'" ' "' | \
grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
sed -e 's/^.*"\([^"]\+\)".*$/\1/g'`
for j in $TMP; do
echo $j
done
Aus einem HTML Code möchte ich einfach alle Verlinkungen raussuchen. Das funktioniert auch soweit..bis auf Links mit Leerzeichen, da diese dann in der for Schleife getrennt werden. Mir fällt so recht aber keine Lösung dafür ein
Gruss, cfour
-
r900
- Beiträge: 1053
- Registriert: 09.10.2011 20:06:11
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Stockholm
Beitrag
von r900 » 24.08.2013 01:30:25
Wenn du das siehst setzt bestimmt der Kopf->Tischplatte Reflex ein
Du könntest auch vorher Leerzeichen durch
%20 ersetzen.
In ruby lässt sich das allerdings wesentlich schöner machen weil man einen HTML-parser benutzen kann. Siehe z.B. hier (sehr ausfuehrlich):
http://ruby.bastardsbook.com/chapters/html-parsing/
-
cfour
- Beiträge: 5
- Registriert: 24.08.2013 01:02:11
Beitrag
von cfour » 24.08.2013 11:10:54
r900 hat geschrieben:Wenn du das siehst setzt bestimmt der Kopf->Tischplatte Reflex ein
Du könntest auch vorher Leerzeichen durch
%20 ersetzen.
In ruby lässt sich das allerdings wesentlich schöner machen weil man einen HTML-parser benutzen kann. Siehe z.B. hier (sehr ausfuehrlich):
http://ruby.bastardsbook.com/chapters/html-parsing/
das hatte ich schon probiert...ABER auch dann trennt er weiterhin...überall wo leerzeichen oder %20 auftauchen, erhalte ich eine neue Zeile. Ruby wäre wohl zu langsam...die Performance spielt eine große Rolle. Wobei ich meine o.g. Lösung da auch noch eher langsam empfinde.
-
r900
- Beiträge: 1053
- Registriert: 09.10.2011 20:06:11
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Stockholm
Beitrag
von r900 » 24.08.2013 12:33:04
cfour hat geschrieben:ABER auch dann trennt er weiterhin...überall wo leerzeichen oder %20 auftauchen, erhalte ich eine neue Zeile.
Ach ja, dumm von mir. Mit Anführungszeichen nimmt er alles als einen String. Du musst IFS (internal field seperator) neu setzen.
Code: Alles auswählen
OLDIFS=$IFS
IFS=$'\n'
for j in $TMP; do
echo "$j"
done
IFS=$OLDIFS
Was die Geschwindigkeit angeht könnte ruby sogar besser sein, denn tr + grep + sed kostet auch Zeit.
-
r900
- Beiträge: 1053
- Registriert: 09.10.2011 20:06:11
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Stockholm
Beitrag
von r900 » 24.08.2013 14:27:32
Die Ausgabe von grep ist durch newlines getrennt. D.h. bei deinem sed-Muster kannst du dir das "g" am Ende sparen.
Oder gleich ganz ohne sed, etwa so:
Code: Alles auswählen
while IFS=\" read -r _ link _; do
echo "$link"
done < <(echo "$HTML" | tr .... | grep -i -o ...)
Anm.:
<( .. ) funktioniert nur mit bash (nicht mit sh/dash).
Übrigens solltest du das
$HTML auf jeden Fall in Anführungszeichen setzen. Vergleich einfach mal die Ausgabe von diesem Beispiel:
Code: Alles auswählen
TMP=$(echo -e 'ANFANG\n\n*\n\nENDE')
echo "$TMP"
echo $TMP
-
Phineas
- Beiträge: 354
- Registriert: 20.06.2012 20:26:19
Beitrag
von Phineas » 24.08.2013 18:20:11
Es gibt ziemlich verhunzte HTML-Codes im Web. Die Browser/Parser sind da ziemlich Fehlertolerant. Ein solcher Parser ist also zu empfehlen. Ich benutze noch den alten Lynx dafür. Der ist tolerant und schnell:
Man muss noch ein wenig weiter filtern, aber Leerzeichen sind keine mehr zu erwarten.
-
r900
- Beiträge: 1053
- Registriert: 09.10.2011 20:06:11
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Stockholm
Beitrag
von r900 » 25.08.2013 03:37:09
Phineas hat geschrieben:Man muss noch ein wenig weiter filtern, aber Leerzeichen sind keine mehr zu erwarten.
Das Filtern kann man sich sparen:
-
cfour
- Beiträge: 5
- Registriert: 24.08.2013 01:02:11
Beitrag
von cfour » 25.08.2013 15:23:43
r900 hat geschrieben:Phineas hat geschrieben:Man muss noch ein wenig weiter filtern, aber Leerzeichen sind keine mehr zu erwarten.
Das Filtern kann man sich sparen:
vielen vielen Dank
War mir schon eine große Hilfe. Die Idee mit lynx ist natürlich sehr schön...nur ist das wirklich schneller als wget etc?
-
r900
- Beiträge: 1053
- Registriert: 09.10.2011 20:06:11
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Stockholm
Beitrag
von r900 » 25.08.2013 18:07:29
cfour hat geschrieben:Die Idee mit lynx ist natürlich sehr schön...nur ist das wirklich schneller als wget etc?
Das kannst du mit
time leicht herausfinden.
-
cfour
- Beiträge: 5
- Registriert: 24.08.2013 01:02:11
Beitrag
von cfour » 25.08.2013 21:18:07
Es ist schneller
Leider habe ich jetzt ein neues Problem. Kann ich lynx nicht dazu bewegen, nur die Link Liste auszugeben? Also ohne die dump page...bei Images geht das nämlich schied. Die manual hat mich leider nicht weiter gebracht.
Es ginge natürlich ein einfaches lynx | grep http aber das wirkt sich dann wieder negativ auf die Performance aus.
Gruss, cfour
edit: -listonly gibt es scheinbar nicht mehr
-
r900
- Beiträge: 1053
- Registriert: 09.10.2011 20:06:11
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Stockholm
Beitrag
von r900 » 25.08.2013 21:49:35
cfour hat geschrieben:edit: -listonly gibt es scheinbar nicht mehr
In welcher Version? Bei 2.8.8dev.12-2 aus Debian Wheezy gibt es sie jedenfalls. Könnte sein dass es sie in deiner Version
noch nicht gibt:
255571
-
cfour
- Beiträge: 5
- Registriert: 24.08.2013 01:02:11
Beitrag
von cfour » 25.08.2013 22:05:04
r900 hat geschrieben:cfour hat geschrieben:edit: -listonly gibt es scheinbar nicht mehr
In welcher Version? Bei 2.8.8dev.12-2 aus Debian Wheezy gibt es sie jedenfalls. Könnte sein dass es sie in deiner Version
noch nicht gibt:
255571
Lynx Version 2.8.8dev.5 (25 Aug 2010)
-
Cae
- Beiträge: 6349
- Registriert: 17.07.2011 23:36:39
- Wohnort: 2130706433
Beitrag
von Cae » 25.08.2013 22:51:31
Klingt nach Squeeze, also oldstable. Vielleicht solltest du auf Wheezy hochziehen? Das musst du eh innerhalb des naechsten Dreivierteljahres machen, da kannst du auch gleich von einem aktuelleren/weniger verbuggten Lynx profitieren.
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
-
Phineas
- Beiträge: 354
- Registriert: 20.06.2012 20:26:19
Beitrag
von Phineas » 26.08.2013 05:40:11
Ich habe den Uropa - und er kann listonly:
Code: Alles auswählen
~> lynx -version
Lynx Version 2.8.6rel.5 (09 May 2007)
cfour hat geschrieben:...bei Images geht das nämlich schied.
Hast Du einen Image-Download mal direkt mit wget und den folgenden drei Optionen getestet bzw. hilft Dir das weiter?
Code: Alles auswählen
~> man wget
...
-r
--recursive
Turn on recursive retrieving.
...
-l depth
--level=depth
Specify recursion maximum depth level depth. The default maximum depth is 5.
...
-A acclist
--accept acclist
..