Bash: Inhalt aus Zeile mit <div class="codecontent">xyzabc<div> extrahieren

  • Hallo Leute,


    ich brauche Hilfe für einen Part in einem Skript. Auf einer Webseite (wird geholt mit wget) befindet sich ein Segment mit

    Code
    <div class="codecontent">der zu extrahierende Part</div>Hier steht dann weiterer Text, welcher ignoriert werden kann...


    Ich möchte den zu extrahierenden Part extrahieren und weiterverarbeiten. Das sollte ja irgendwie mit grep, sed & co sowie regulären Ausdrücken gehen. Kann mir einer der Bash-Experten da weiter helfen?


    BJ1

    Einmal editiert, zuletzt von BJ1 ()

  • Wenn das in einer einzelnen Zeile steht geht das z.B. so mit sed:

    Code
    sed -n 's/<div class="codecontent">\(.*\)<\/div>/\1/p' datei.html


    Code
    $ cat test.txt
    <body>
    <div class="codecontent">der zu extrahierende Part</div>
    </body>
    $ sed -n 's/<div class="codecontent">\(.*\)<\/div>/\1/p' test.txt
    der zu extrahierende Part

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • alternativ mit grep --only-matching oder kurz -o

    Code
    grep -o <div class="codecontent">.*<\/div> quelltext

    VDR-User #992
    Server: Asrock N3700-ITX mit Cine S2 6.5 headless
    System: Ubuntu 22.04.LTS
    VDR: VDR 2.2.0 mit epgsearch, live, vnsiserver
    Client: Raspberry Pi v4 mit LibreElec

  • Mit grep müsste das dann doch eher so aussehen, oder?

    Code
    grep -Po '(?<=<div class="codecontent">).*(?=<\/div>)' datei.html

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Ich danke Euch!


    Variante 1 von seahawk liefert alle divs zurück, die in der HTML notiert sind.
    Post #4 liefert das gewünschte Ergebnis, jedoch kommt ab hier noch der Rest der Zeile bis zum Zeilenumbruch incl. dem Ende-Tag (</div) mit...
    Konkret geht es um das Filtern eines Schlüssels, welcher sich aller 2 Monate periodisch ändert ;).


    BJ1

  • Variante 1 von seahawk liefert alle divs zurück, die in der HTML notiert sind.

    Wie sieht das html denn aus? gibt es da mehrere divs in einer Zeile?
    Dann würde ich es mit der PCRE-Syntax in grep non-greedy versuchen:

    Code
    $ cat test.txt
    <body>
    <div class="codenoncontent">der nicht zu extrahierende Part</div><div class="codecontent">der zu extrahierende Part</div><div class="codenoncontent">der nicht zu extrahierende Part</div>
    </body>
    $ grep -Po '(?<=<div class="codecontent">).*?(?=<\/div>)' test.txt
    der zu extrahierende Part

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Wie ist der Schlüssel den aufgebaut? Kann man da z.B. annehmen, dass er nur aus Ziffern und Buchstaben besteht und eine bestimmte Länge hat? Dann tut man sich mit dem Matchen generell leichter...

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    Einmal editiert, zuletzt von seahawk1986 ()

  • Hast PN. Deine letzte Variante liefert übrigens das korrekte Ergebnis.


    BJ1

  • Warum sich eigentlich immer mit grep, sed und Konsorten rumärgern, wenn es evtl. viel stabiler mit einer Programmiersprache geht?
    Z.B. der html.parser in Python: https://docs.python.org/3/library/html.parser.html


    Lars.

  • Lars, da hast Du sicherlich recht, es geht hier jedoch nur um eine kleine Ergänzung in einem bereits bestehenden und funktionierenden Shellskript...


    BJ1

  • Warum sich eigentlich immer mit grep, sed und Konsorten rumärgern, wenn es evtl. viel stabiler mit einer Programmiersprache geht?

    Weil ich so Sachen wie BeautifulSoup oder lxml lieber erst auspacke, wenn ich weiß wie die Struktur der HTML-Datei genau aussieht...

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • es geht hier jedoch nur um eine kleine Ergänzung in einem bereits bestehenden und funktionierenden Shellskript...


    Ob man nun eine Zeile mit grep einbaut oder ein anderes Programm aufruft, ist ja relativ egal. :)
    Ok, man muss das Python-Script natürlich auch noch irgendwo ablegen. Aber gerade die grep/sed-Geschichte kann immer mal schnell nach hinten losgehen, wenn in der html-Datei zufällig mal ein Zeilenumbruch dazukommt usw.


    An den Rest:
    Das sind die Antworten, die ich mir erhofft habe. :)


    Lars.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!