HTML Quelltext nach Stringmuster parsen und in eine Datei schreiben

    • [ offen ]

      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:

      Quellcode

      1. </tr><tr>
      2. <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13044128891107017066178632747091" class="zks_cntlnk_downl">G088161010 ENT<br/></a></td>
      3. <td>03.05.2011 10:54:49</td>
      4. <td>BGS / 177635616223804 / RA-FS558</td>
      5. </tr><tr>
      6. <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13237953322745012591947546631736" class="zks_cntlnk_downl">ASVCMOD019 PROV<br/></a></td>
      7. <td>13.12.2011 17:55:32</td>
      8. <td>RQT / 2537f0b4-5e43-4</td>
      9. </tr><tr>
      10. <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13238466428934842004851035756157" class="zks_cntlnk_downl">ASVCMOD019 PROV<br/></a></td>
      11. <td>14.12.2011 08:10:43</td>
      12. <td>RQT / bdfa75e4-31ff-4</td>
      13. </tr></table><br /><h2>KLINK-Entsorgung, M58REC0027 / Entsorger</h2>
      14. <table cellspacing="0" class="zks_cnt_tbl zks_cnt_epost">
      15. <tr>

      Am Beispiel von

      Quellcode

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

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „HassanMullah“ () aus folgendem Grund: Thema wird erweitert

      hi,

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

      AutoIt-Quellcode

      1. #include <string.au3>
      2. $str = "dein quelltext" ;oder mit clipget() oder direkt über _inetgetsource()
      3. $line = _stringbetween($str,'id=zksMID','"')
      4. for $i = 0 to ubound($line)-1
      5. filewrite("deinetxt.txt",$line[$i])
      6. next


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

      1. #include <string.au3>
      2. #include <array.au3>
      3. $String='</tr><tr>' &@CRLF
      4. $String&=' <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13044128891107017066178632747091" class="zks_cntlnk_downl">G088161010 ENT<br/></a></td>'&@CRLF
      5. $String&=' <td>03.05.2011 10:54:49</td>'&@CRLF
      6. $String&=' <td>BGS / 177635616223804 / RA-FS558</td>'&@CRLF
      7. $String&=' </tr><tr>'&@CRLF
      8. $String&=' <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13237953322745012591947546631736" class="zks_cntlnk_downl">ASVCMOD019 PROV<br/></a></td>'&@CRLF
      9. $String&=' <td>13.12.2011 17:55:32</td>'&@CRLF
      10. $String&=' <td>RQT / 2537f0b4-5e43-4</td>'&@CRLF
      11. $String&=' </tr><tr>'&@CRLF
      12. $String&=' <td><a href="/LaenderEANV_Web/postfach?leanv_postfach_action=openDoc&id=zksMID13238466428934842004851035756157" class="zks_cntlnk_downl">ASVCMOD019 PROV<br/></a></td>'&@CRLF
      13. $String&=' <td>14.12.2011 08:10:43</td>'&@CRLF
      14. $String&=' <td>RQT / bdfa75e4-31ff-4</td>'&@CRLF
      15. $String&=' </tr></table><br /><h2>KLINK-Entsorgung, M58REC0027 / Entsorger</h2>'&@CRLF
      16. $String&='<table cellspacing="0" class="zks_cnt_tbl zks_cnt_epost">'&@CRLF
      17. $String&='<tr>'
      18. MsgBox(0,"test",$String)
      19. $ID=_StringBetween($String,'id=','"')
      20. _ArrayDisplay($ID)
      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:
      Andere ID:

      AutoIt-Quellcode

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


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

      PHP-Quellcode

      1. </tr><tr>
      2. <td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID1350487715331683322635013472094" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>
      3. <td>17.10.2012 17:28:36</td>
      4. <td>ENS / ENI375RCR168 </td>
      5. </tr><tr>
      6. <td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID1350642330996918345786918694013" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>
      7. <td>19.10.2012 12:25:31</td>
      8. <td>ENS / ENI375RCR168 </td>
      9. </tr><tr>
      10. <td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13506471929937500251323432454104" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>
      11. <td>19.10.2012 13:46:34</td>
      12. <td>ENS / ENI375RCR172 </td>
      13. </tr><tr>
      14. <td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID1350647250822537655534347189580" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>
      15. <td>19.10.2012 13:47:31</td>
      16. <td>ENS / ENI375RCR172 </td>
      17. </tr><tr>
      18. <td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13506473107021780770208607756122" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>
      19. <td>19.10.2012 13:48:31</td>
      20. <td>BGS / 101579582354185</td>
      21. </tr><tr>
      22. <td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509173780845298174083252006356" class="zks_cntlnk_downl">ASVCMOD019 PROV<br/>Service-Modul</a></td>
      23. <td>22.10.2012 16:49:38</td>
      24. <td>RQT / 7f000309-c3bd-4</td>
      25. </tr><tr>
      26. <td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509176158795432820887193055664" class="zks_cntlnk_downl">ASVCMOD019 PROV<br/>Service-Modul</a></td>
      27. <td>22.10.2012 16:53:36</td>
      28. <td>RQT / bb576022-ab72-4</td>
      29. </tr><tr>
      30. <td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>
      31. <td>23.10.2012 13:58:33</td>
      32. <td>QT / 183825683041081 / REG-FT 15 </td>

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

      1. <td>QT
      steht, dann soll die zksMID aus Zeile 30 gelesen werden, wenn jedoch dort z.B.

      PHP-Quellcode

      1. <td>BGS
      steht (siehe Zeile 20), dann soll die Zeile 18 nicht gelesen werden.

      Kann man sowas irgendwie hinbekommen ?

      x0r schrieb:

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

      HassanMullah schrieb:

      Kann man sowas irgendwie hinbekommen ?
      Und genau an dieser Stelle setzt nun RegEx an. ^^
      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <Array.au3>
      2. $sHTML = '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
      3. $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
      4. $sHTML &= '<td>QT / 183825683041081 / REG-FT 15 </td>' &@LF
      5. $sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
      6. $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
      7. $sHTML &= '<td>Q1T / 183825683041081 / REG-FT 15 </td>' &@LF
      8. $sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
      9. $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
      10. $sHTML &= '<td>ABC / 183825683041081 / REG-FT 15 </td>' &@LF
      11. $sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
      12. $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
      13. $sHTML &= '<td>1234 / 183825683041081 / REG-FT 15 </td>' &@LF
      14. $sHTML &= '<td><a href="/Web/postfach?postfach_action=openDoc&id=zksMID13509935131916155264644490769628" class="zks_cntlnk_downl">I375S00051 ENT<br/>FirmaA<br/>Bodenbehandlungsanlage</a></td>'&@LF
      15. $sHTML &= '<td>23.10.2012 13:58:33</td>' & @LF
      16. $sHTML &= '<td>LSD / 183825683041081 / REG-FT 15 </td>' &@LF
      17. $aResult = StringRegExp($sHTML,'(?s)id=(\w+?)\".*?<td>(?:QT|ABC|123) ',3)
      18. If IsArray($aResult) Then
      19. _ArrayDisplay($aResult)
      20. Else
      21. ConsoleWrite("Nichts Gefunden!" & @LF)
      22. EndIf

      "(?: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 :rolleyes:
      @x0r: Nicht traurig sein, Du hast dafür andere Qualitäten :-)

      @Christoph54: 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

      HassanMullah schrieb:

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

      HassanMullah schrieb:

      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 :rolleyes:
    autoit.de Webutation