# sed: link aus html file extrahieren

## 72_6f_6c_61_6e_64

Hallo,

ich weiß das ist ein Gentoo Forum, aber ich hab schon mal ein Thema gesehen, in dem über sed diskutiert wurde.

Ich habe folgendes Problem.

Ich hol mir mit curl eine Seite, und will alle Links (a href) in einer Datei stehen haben.

Ich hab mal mit "grep 'a href'" nur die relevanten Zeilen herausgenommen.

Ich kenn mich aber mit sed nicht genug aus. Was muss man sed als Parameter anhängen, dass er alles von "<a href" bis ">" (also der a-tag zu) ausgibt?

LG Roland

----------

## Christian99

Hallo, schau dir doch mal das hier an: http://www.thomashertweck.de/sedawk.html

wenn du danach noch fragen hast, nur zu!

Schöne Grüße

Christian

----------

## 72_6f_6c_61_6e_64

Danke für den Link. Das ist ein super Tutorial, ich hab schon ein paar gelesen, die waren aber nie so informativ.

Verstanden hab ich glaub ich jetzt mehr, aber ich weiß immer noch nicht genau wie ich das ausfiltre.

Mit grep 'a href' bekomm ich ja die Zeilen, aber wie man nur den http-link rauskommt da scheitere ich.

----------

## Finswimmer

echo "eiaeae<a href="http://www.test.de">test.de</a>aieiaeaiea" | gawk -F= '{ print $2 }'| gawk -F\> '{ print $1 }'

----------

## 72_6f_6c_61_6e_64

Danke für das Beispiel. Das geht ja sogar ohne sed.

Ich hab am mac kein gawk sondern nur awk (das ist aber das selbe oder? das g steht ja nur für GNU).

Bei deinem Beispiel funktioniert das auch wunderbar.

aber wenn ich ein curl davor in die pipe hänge kommt viel aber kein einziger link den ich suche.

Edit:

wenn ich das richtig lese zeigt er mir den Inhalt der tags davor.

----------

## yuhu

zeig mal ein Beispiel wie es nicht geht.

----------

## 72_6f_6c_61_6e_64

kommen tut sowas auf die art:

```
'catlinks' class

"visualClear"

"mw-head" class

"p-personal" class

"pt-login"

"left-navigation"

"p-namespaces" class

"ca-special" class

"p-variants" class

"#"

"menu"

"right-navigation"

"p-views" class

"p-cactions" class

"#"

"menu"

"p-search"

"searchInput"

"/w/index.php" id

'hidden' name

"simpleSearch"

"searchInput" name

"searchButton" type

"mw-panel" class

"p-logo"

"portal" id

"body"

"n-mainpage-description"

"n-aboutsite"

"n-topics"

"n-alphindex"

"n-randompage"

"portal" id

"body"

"n-help"

"n-portal"

"n-recentchanges"

"n-contact"

"n-sitesupport"

"portal" id

"body"

"t-specialpages"


"footer"

"footer-places"

"footer-places-privacy"

"footer-places-about"

"footer-places-disclaimer"

"footer-places-mobileview"

"footer-icons" class

"footer-copyrightico"

"http://wikimediafoundation.org/"

"footer-poweredbyico"

"http://www.mediawiki.org/"

"clear:both"

"text/javascript"

"/w/index.php?title

"http://bits.wikimedia.org/de.wikipedia.org/load.php?debug

"text/javascript"

"text/javascript" src

"text/javascript"
```

----------

## Christian99

ich bin mir net sicher, aber hast du jetzt das 

```
|grep "a href"|
```

 rausgelassen? das sieht mir fast so aus.

lass doch mal die ausgabe von curl in eine datei umleiten und poste die mal (am besten paste service oder so und auchtung falls sessionids drin sind. die am besten rausmachen) und außerdem den befehl den du verwendest. dann lässt sich das besser nachvollziehen.

----------

## 72_6f_6c_61_6e_64

korrekt, das hab ich vergessen.

jetzt kommt aber:

```
curl "http://de.wikipedia.org/w/index.php?title=Spezial:Alle_Seiten" | grep 'href' | awk -F= '{ print $2 }' | awk -f\> '{ print $1 }'            

awk: can't open file { print $1 }

 source line number 1 source file { print $1 }

 context is

    >>>  <<< 

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100 54049  100 54049    0     0  61831      0 --:--:-- --:--:-- --:--:-- 67900
```

----------

## Christian99

auf den ersten blick würd ich sagen, das f beim zweiten awk muss groß sein

----------

## Knieper

```
elinks -dump -no-numbering "http://de.wikipedia.org/w/index.php?title=Spezial:Alle_Seiten" | grep '^[ \t.]*http' | sed 's/^[ .\t]*//'
```

Einfach mal abgewöhnen in html mit regulären Ausdrücken rumzufuschen. Html ist nicht regulär.

----------

## slick

Parsen des HTML-Code liefert auch relative Links etc. zurück. Für "komplette" Links besser mit lynx:

(ungetestet aus dem Kopf)

```
lynx -dump "$url" | grep -e " .[0-9+]\.\ "| cut -d "." -f 2-
```

Da lassen sich noch schön weitere greps anhängen um die Links genauer zu selektieren.

----------

## 72_6f_6c_61_6e_64

damit spuckt er mal links aus, aber längst nicht alle

----------

## 178238

 *72_6f_6c_61_6e_64 wrote:*   

>  Was muss man sed als Parameter anhängen, dass er alles von "<a href" bis ">" (also der a-tag zu) ausgibt?    
> 
> 

 

Nabend.

Eigentlich sollte das sein was du suchst:

```
curl -s "$URL" | sed -ne 's/.*href="\([^["]*\)".*/\1/pg'
```

Kann man evtl. noch verfeiner:

```
curl -s "$URL" | sed -ne 's/.*<a href="\(http:\/\/[^["]*\)".*/\1/pg' 
```

----------

## 72_6f_6c_61_6e_64

Hallo, die Sachen mit sed geben zwar links aus, aber noch immer nicht alles.

die links schauen so aus:

<a href="/w/index.php?title=Spezial:Alle_Seiten&amp;from=Alatriste&amp;to=Ali_Chamene%27i">Ali Chamene'i</a>

wie muss ich das dann anpassen?

----------

## 178238

Sofern man wirklich nur sed hernehmen will würde ich das auf die Schnelle mal mit

```
curl -s "http://de.wikipedia.org/w/index.php?title=Spezial:Alle_Seiten"  | sed -e 's/href/\nhref/g' | sed -ne 's/.*href="\([^["]*\)".*/\1/pg'
```

...lösen. Ist für meinen Geschmack zwar unsauber, sollte aber zumindestens alle Links ausspucken.

----------

## 72_6f_6c_61_6e_64

alles kommt da aber immer noch nicht

----------

## 178238

Da ich kein sed-Guru bin kann das durchaus sein  :Wink:  Ich muss mich dann allerdings auch Knieper anschließen: HTML und reguläre Ausdrücke vertragen sich nicht sonderlich. Dazu mal ein netter Artikel: http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html. 

Ein anderes großes Problem ist IMHO die Tatsache, dass sed kein "non greedy matching" bietet. Hierzu evtl.: http://stackoverflow.com/questions/1103149/non-greedy-regex-matching-in-sed

Sofern man nun wirklich nur sed nehmen will und auf grep/awk/perl etc. völlig verzichtet, kommt man nicht darum herum sein sed script mehr oder weniger statisch an den zu erwartenden (html-)code anzupassen. Wenn nun z.B. mehrere Links pro Zeile kommen heißt das extra newlines am Ende eines Tags einzufügen und ähnliche Grausamkeiten. In dem Zusammenhang kannst du ja gerne den Link/Code posten um den es dir geht. 

Kritik zu meinem Gesagtem ist durchaus erwünscht  :Wink: 

----------

