HTML Quelltext nach Stringmuster parsen und in eine Datei schreiben

  • Hallo zusammen,

    ich stehe gerade vor folgendem Problem, welches ich gerne mit Autoit und nicht mit notepad++ lösen möchte :)

    Ich muss von einigen Webseiten mir den kompletten Quelltext anzeigen lassen und aus diesem ein bestimmtes Stringmuster finden, welches dann in eine separate Textdatei geschrieben werden muss.

    Hier mal ein Beispielausschnitt:


    Am Beispiel von

    Code
    id=zksMID13044128891107017066178632747091"


    brauche ich dann den String "zksMID13044128891107017066178632747091", da die Zahlen jedoch nonstop andere sind, muss ich die Suche einschränken, d.h. vorne nach id=zksMID und hinten mit Anführungzeichen beenden.

    Ich habe leider überhaupt keine Ansatz, wie ich das anstellen soll. Kann mich bitte mal jemand in die richtige Richtung schubsen ?

    Danke

    2 Mal editiert, zuletzt von HassanMullah (3. Juni 2013 um 16:10) aus folgendem Grund: Thema wird erweitert

  • hi,

    mit _stringbetween() biste ganz gut beraten, denk ich :)

    [autoit]

    #include <string.au3>
    $str = "dein quelltext" ;oder mit clipget() oder direkt über _inetgetsource()
    $line = _stringbetween($str,'id=zksMID','"')

    [/autoit][autoit][/autoit][autoit]

    for $i = 0 to ubound($line)-1
    filewrite("deinetxt.txt",$line[$i])
    next

    [/autoit]

    musst evtl noch bissl umbauen, is nur kurz hingeklatscht :D

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Mal zum direkt Testen:

    [autoit]

    #include <string.au3>
    #include <array.au3>
    $String='</tr><tr>' &@CRLF
    $String&=' <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13044128891107017066178632747091" class="zks_cntlnk_downl">G088161010 ENT<br/></a></td>'&@CRLF
    $String&=' <td>03.05.2011 10:54:49</td>'&@CRLF
    $String&=' <td>BGS / 177635616223804 / RA-FS558</td>'&@CRLF
    $String&=' </tr><tr>'&@CRLF
    $String&=' <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13237953322745012591947546631736" class="zks_cntlnk_downl">ASVCMOD019 PROV<br/></a></td>'&@CRLF
    $String&=' <td>13.12.2011 17:55:32</td>'&@CRLF
    $String&=' <td>RQT / 2537f0b4-5e43-4</td>'&@CRLF
    $String&=' </tr><tr>'&@CRLF
    $String&=' <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13238466428934842004851035756157" class="zks_cntlnk_downl">ASVCMOD019 PROV<br/></a></td>'&@CRLF
    $String&=' <td>14.12.2011 08:10:43</td>'&@CRLF
    $String&=' <td>RQT / bdfa75e4-31ff-4</td>'&@CRLF
    $String&=' </tr></table><br /><h2>KLINK-Entsorgung, M58REC0027 / Entsorger</h2>'&@CRLF
    $String&='<table cellspacing="0" class="zks_cnt_tbl zks_cnt_epost">'&@CRLF
    $String&='<tr>'

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,"test",$String)
    $ID=_StringBetween($String,'id=','"')
    _ArrayDisplay($ID)

    [/autoit]

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Hallo zusammen,

    die Lösung von x0r war perfekt. Habe das ganze mit der Zwischenablage verwirklicht und den String noch in der Textdatei etwas angepasst.
    Ich dachte weiß gut was für Code hier zusammen geschustert werden muss, und dann so einfach.

    Super, vielen vielen Dank

  • Kein Thema, gern geholfen! :)

    Ich löse in der Firma meine "Webseite-auslesen"-Aufgaben immer so, ist sehr praktisch, grade in Verbindung mit "_InetGetSource()".

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Andere ID:

    [autoit]

    $line = _stringbetween($str,'id=','"')

    [/autoit]

    ...für die kleine Änderung am Script lern ich mich jetzt nicht extra in Regex ein ;)

    Man kann auch so ganz gut die Probleme lösen, wenn auch manchmal ein wenig umständlich.

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Hallo,

    ich muss den Thread nochmals öffnen, da ich die Abfrage etwas erweitern muss.
    Hier nochmals ein Beispielquelltext

    neuer Quelltext


    Ich nehme als Beispiel mal die Zeile 30 und 32. Momentan liest das Script ja ALLE "zksMIDs" aus. Ich brauche jetzt aber die Lösung so, dass wenn z.B. in Zeile 32 ein

    PHP
    <td>QT

    steht, dann soll die zksMID aus Zeile 30 gelesen werden, wenn jedoch dort z.B.

    PHP
    <td>BGS

    steht (siehe Zeile 20), dann soll die Zeile 18 nicht gelesen werden.

    Kann man sowas irgendwie hinbekommen ?

  • ...für die kleine Änderung am Script lern ich mich jetzt nicht extra in Regex ein

    Kann man sowas irgendwie hinbekommen ?

    Und genau an dieser Stelle setzt nun RegEx an. ^^

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $sHTML = '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
    $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
    $sHTML &= '<td>QT / 183825683041081 / REG-FT 15 </td>' &@LF
    $sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
    $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
    $sHTML &= '<td>Q1T / 183825683041081 / REG-FT 15 </td>' &@LF
    $sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
    $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
    $sHTML &= '<td>ABC / 183825683041081 / REG-FT 15 </td>' &@LF
    $sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
    $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
    $sHTML &= '<td>1234 / 183825683041081 / REG-FT 15 </td>' &@LF
    $sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
    $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
    $sHTML &= '<td>LSD / 183825683041081 / REG-FT 15 </td>' &@LF

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $aResult = StringRegExp($sHTML,'(?s)id=(\w+?)\".*?<td>(?:QT|ABC|123) ',3)
    If IsArray($aResult) Then
    _ArrayDisplay($aResult)
    Else
    ConsoleWrite("Nichts Gefunden!" & @LF)
    EndIf

    [/autoit]


    "(?:QT|ABC|123)" Dieser Teil des Patterns funktioniert wie ein Oder: Es werden Einträge gefunden, die entweder ein "QT" oder "ABC" oder "123" haben. Das kannst du dann so anpassen, wie du es brauchst... ;)

    LG
    Christoph :)

  • Ich beneide alle, die RegEx drauf haben, ihr seid toll! :D

    ...und ich bin doof, weil ichs nicht kann :wacko:

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • x0r: Nicht traurig sein, Du hast dafür andere Qualitäten :)

    BinDannMalWeg: Ich traue mich ja langsam an RegEx ran, aber ich habe an Deinem Beispiel 2 Verständnisprobleme.

    1.) Du zerlegst meine paar Beispielzeilen in den String $sHTML. Das sieht hier nach viel "Schreibarbeit" aus. Ich habe aber den gesamten Quelltext der Site in der Zwischenablage. Reicht es hier aus, die Zwischenablage in eine Variable auszulesen, oder muss hier noch was "von Hand" gemacht werden.

    2.) Fehlt mir die Logik, woher das Script weiss, wenn es z.B. (an Deinem Beispiel) in Zeile 4 ein "QT" findet, das dann die "zksMID" in Zeile 2 interessant ist und gezogen werden muss.

    Gruss und vielen Dank

    Hassan

  • 1.) Du zerlegst meine paar Beispielzeilen in den String $sHTML. Das sieht hier nach viel "Schreibarbeit" aus. Ich habe aber den gesamten Quelltext der Site in der Zwischenablage. Reicht es hier aus, die Zwischenablage in eine Variable auszulesen, oder muss hier noch was "von Hand" gemacht werden.

    Die Variable $sHTML und die Zeilen in denen Teile deines Quelltextes hineinschreibe waren allein zum Testen da. Wichtig ist eigentlich nur Zeile 19. Wie du nun den Quelltext in eine Variable bekommst kannst du dir aussuchen. Du könntest beispielsweise statt $sHTML auch einfach ClipGet() schreiben und alles über Zeile 19 löschen...;)

    2.) Fehlt mir die Logik, woher das Script weiss, wenn es z.B. (an Deinem Beispiel) in Zeile 4 ein "QT" findet, das dann die "zksMID" in Zeile 2 interessant ist und gezogen werden muss.

    Leider habe ich gerade nicht die Zeit, um das ganze RegEx-Pattern für dich aufzubröseln, aber ich erkläre es dir jetzt mal vereinfacht so: Das Pattern 'sucht' im Quelltext nach einer ID und schaut dann noch ob "kurz darauf" ein <td>QT (oder 123 oder ABC) auftritt. Zur Veranschaulichung kannst du auch mal folgendes tun: Wenn du in der "Oder-Klammer" das "?:" rauslöschst, wird dir im Array zusätzlich immer noch das QT oder 123 oder ABC ausgegeben.
    Ich hoffe ich hab es einigermaßen verständlich erklärt... :)
    Achja: Wenn du den "Quelltext" von einer Internetseite kopierst kannst du dir das kopieren sparen, indem du mit deinem Script die Seite direkt herunterlädst. (InetGet;InetGetSource)

    LG
    Christoph :)