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

    meine Hardware

    Produktiv/Testsystem/Datengrab (AZi): XBMCBuntu auf 14.04 LTS, TVHeadend | Asrock H61, Intel Celeron, Asus GT610 | 2 GB 1066 RAM | 2,5" 100GB (System + Aufnahme), 3xWD EARX 2 TB SATA II + 1x Samsung 2 TB SATA II, mhddfs | Triple DVB-C (Digital Devices Cine CT + Satelco Easywatch DVB-C) | Atric IR Rev.5 | Silverstone LC10
    Produktiv (WoZi): XBMCBuntu auf 14.04 LTS, TVHeadend | MSI C847MS-E33, Zotac GT630 | 1GB 1333 RAM | 8 GB CF-Card System + WD 1TB Daten | DD DVB-C/T Dualtuner | Atric IR Rev.5 + Logitech Harmony 300

    Edited once, last by BJ1 (October 8, 2014 at 1:08 PM).

  • 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
    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    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
    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    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

    meine Hardware

    Produktiv/Testsystem/Datengrab (AZi): XBMCBuntu auf 14.04 LTS, TVHeadend | Asrock H61, Intel Celeron, Asus GT610 | 2 GB 1066 RAM | 2,5" 100GB (System + Aufnahme), 3xWD EARX 2 TB SATA II + 1x Samsung 2 TB SATA II, mhddfs | Triple DVB-C (Digital Devices Cine CT + Satelco Easywatch DVB-C) | Atric IR Rev.5 | Silverstone LC10
    Produktiv (WoZi): XBMCBuntu auf 14.04 LTS, TVHeadend | MSI C847MS-E33, Zotac GT630 | 1GB 1333 RAM | 8 GB CF-Card System + WD 1TB Daten | DD DVB-C/T Dualtuner | Atric IR Rev.5 + Logitech Harmony 300

  • 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
    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    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...

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    Edited once, last by seahawk1986 (October 8, 2014 at 1:33 PM).

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

    BJ1

    meine Hardware

    Produktiv/Testsystem/Datengrab (AZi): XBMCBuntu auf 14.04 LTS, TVHeadend | Asrock H61, Intel Celeron, Asus GT610 | 2 GB 1066 RAM | 2,5" 100GB (System + Aufnahme), 3xWD EARX 2 TB SATA II + 1x Samsung 2 TB SATA II, mhddfs | Triple DVB-C (Digital Devices Cine CT + Satelco Easywatch DVB-C) | Atric IR Rev.5 | Silverstone LC10
    Produktiv (WoZi): XBMCBuntu auf 14.04 LTS, TVHeadend | MSI C847MS-E33, Zotac GT630 | 1GB 1333 RAM | 8 GB CF-Card System + WD 1TB Daten | DD DVB-C/T Dualtuner | Atric IR Rev.5 + Logitech Harmony 300

  • 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.

    vdr2: yaVDR 0.5/softhddevice @ G540, Intel DH67BLB3, Asus GT610/2GB, DDBridge + 2x DuoFlex C/T
    hdvdr: yaVDR unstable/softhddevice @ E8400, Asus P5Q SE Plus, 1x L4M-TwinCI + Flex C/T, 1x Sundtek MediaTV Pro, GT520
    Plugins: | avahi4vdr | dbus2vdr | dynamite | epg2timer | noepg | pvrinput | sundtek |

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

    BJ1

    meine Hardware

    Produktiv/Testsystem/Datengrab (AZi): XBMCBuntu auf 14.04 LTS, TVHeadend | Asrock H61, Intel Celeron, Asus GT610 | 2 GB 1066 RAM | 2,5" 100GB (System + Aufnahme), 3xWD EARX 2 TB SATA II + 1x Samsung 2 TB SATA II, mhddfs | Triple DVB-C (Digital Devices Cine CT + Satelco Easywatch DVB-C) | Atric IR Rev.5 | Silverstone LC10
    Produktiv (WoZi): XBMCBuntu auf 14.04 LTS, TVHeadend | MSI C847MS-E33, Zotac GT630 | 1GB 1333 RAM | 8 GB CF-Card System + WD 1TB Daten | DD DVB-C/T Dualtuner | Atric IR Rev.5 + Logitech Harmony 300

  • 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...

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    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.

    vdr2: yaVDR 0.5/softhddevice @ G540, Intel DH67BLB3, Asus GT610/2GB, DDBridge + 2x DuoFlex C/T
    hdvdr: yaVDR unstable/softhddevice @ E8400, Asus P5Q SE Plus, 1x L4M-TwinCI + Flex C/T, 1x Sundtek MediaTV Pro, GT520
    Plugins: | avahi4vdr | dbus2vdr | dynamite | epg2timer | noepg | pvrinput | sundtek |

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!