E-Mail Adresse auslesen und in eine Datei schreiben

  • Hallo AuoItler,
    ich habe ein kleines Problem was das Auslesen von HTML Dateien betrifft.

    Und zwar möchte ich für mich eine Liste erstellen die es mir ermöglicht "Firmen Namen + E-Mail Adressen" in eine Textdatei zu speichern. Das mit den Namen klappt alles super gut nur die E-Mail Adresse will nicht ausgelesen und gespeichert werden.

    Den Vorab Code habe ich so gemacht, nur die E-Mail will nicht ausgelesen werden.

    Quellcode sieht so aus:

    Code
    <a href="http://www2.dasoertliche.de/?id=2244123438621226015924&recuid=V43QT6NUIEERU5OAKLB2U44PF2P65QLWZEOCKAI&action=58&pagePos=1&dar=1&kw=Grundst%fccksverwaltungen&form_name=detail&lastFormName=search_nat&ci=Hamburg&hitno=0&buab=40000058&backbuab=40000058&zvo_ok=1&zbuab=40000057%2c40000064%2c40000068%2c40000067%2c40000074%2c40000075%2c40000053%2c40000065%2c40000084&orderby=name&ttforderby=rel&buc=2244&verlNr=1126&page=78&context=11&arkey=90400058"   class="preview" onclick="return logDetail('2244123438621', 'name', this)"><span class="">Boelter Immobilien GmbH Immobilien&nbsp;</span> <!-- Name -->
       <a href="mailto:info@boelter-immo.de" onclick="logEmail('http://www2.dasoertliche.de/', '314_100907_1234_0122_20131012014332987_5164', '3014D4B84B832F72B535B6F56EC255D3', '0122', '112', '2244123438621', '400058', '1', '1', '6', 'Grundstücksverwaltungen');" class="topmail" title="E-Mail versenden">info@boelter-immo.de</a>  <!-- E-Mail Adresse -->
    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    #include <Array.au3>
    $i=1
    $oIE = _IECreate("http://www2.dasoertliche.de/?context=11&form_name=search_nat&zbuab=40000057%2C40000064%2C40000068%2C40000067%2C40000074%2C40000075%2C40000053%2C40000065%2C40000084&buc=2244&action=56&recFrom="&$i&"&zvo_ok=1&radius=5&orderby=name&kw=Grundst%FCcksverwaltungen&page=78&buab=40000058&ttforderby=rel&ci=Hamburg", 0, 0)
    $sHtml = _IEBodyReadHTML($oIE)
    ClipPut($sHtml)

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

    $ergebnis1 = StringRegExp($sHtml,' this)"><span class="">([^<]+)',3)
    $ergebnis = StringRegExp($sHtml,'<a href="mailto:[^<]+)"',3)
    _ArrayDisplay($ergebnis1,"Ergebnis_")
    _ArrayDisplay($ergebnis,"Ergebnis")

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

    For $i=1 to 19
    FileWriteLine(@ScriptDir&"\ergebnis.txt",$ergebnis1[$i])
    Next

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

    For $p= 0 to 19
    FileWriteLine(@ScriptDir&"\ergebnis1.txt",$ergebnis[$p])
    next

    [/autoit]

    Also das sind ca. 1140 Adressen kann aber immer nur 20 aufeinmal auslesen (wünschte würden mehr gehen :D)

    Auch habe ich das problem wenn ich das _ArrayDisplay ausschalte gibt er mir nen Error aus, was ich auch nicht verstehe.

    Hoffe Ihr könnt mir dort helfen oder wenigstens Anregungen geben wie ich das am besten hin bekomme.


    EDIT 01:41h

    Also nur mit der Zeile ändern hat es leider nix gebracht. in den Ersten Anläufen funzte es aber danach motzte das Script rum das das Array nicht existiert.

  • Also ich habe mich nochmal im StringRegExp Tutorial durchgefuttert aber konnte nichts finden was mir helfen würde, auch die ganzen Zeichen sind etwas verwirrend für mich :D

    Ich hoffe wirklich das mir jemand da helfen könnte, ich habe nix schlimmes vor mit den Adressen falls dies im Verdacht steht, das ist ne liste für meine Klassenkameraden (Mache gerade eine Umschulung an ner Privaten Schule zum Bauzeichner und Technischer Zeichner) für die Bewerbungen im nächsten Jahr, da haben wir die Umschulung abgeschlossen.

    Falls mir keiner helfen möchte, sagt es bitte einfach :)

    Lg
    Tak | Jochen

  • Hallo,

    also ich kann dir zwar nicht im Internet-Explorer helfen, aber für Firefox klappt es bei mir.

    Hier ist mal ein Ansatz (ich bin auf der Seite mit den Suchergebnissen):

    [autoit]

    #Include <FF3.au3>
    #include <Array.au3>

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

    Global $aAllMails[1], $aAllTitles[1]

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

    If _FFConnect() Then

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

    $iNumberOfEntries = _FFXPath("//div[contains(@id, 'entry_')]", "textContent", 10)

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

    Global $aAllMails[$iNumberOfEntries]
    Global $aAllTitles[$iNumberOfEntries]

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

    For $i = 0 To ($iNumberOfEntries-1)
    $aAllTitles[$i] = _FFXPath("//div[@id='entry_" & $i & "']//a[@class='preview']", "textContent", 9)
    $aAllMails[$i] = _FFXPath("//div[@id='entry_" & $i & "']//a[@class='topmail']", "textContent", 9)
    Next

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

    _ArrayDisplay($aAllMails, "Mails")
    _ArrayDisplay($aAllTitles, "Titel")
    Else
    MsgBox(64,"Error","Can't connect to FireFox")
    EndIf

    [/autoit]

    Solltest du weitere Hilfe brauchen, dann melde dich einfach nochmal. Kannst mich auch per PN anschreiben.

  • Moin!

    Dein Email-Pattern ist falsch. Der schließenden Klammer muss eine Öffnende vorausgehen, also so:

    [autoit]

    $ergebnis = StringRegExp($sHtml,'<a href="mailto:(.*)"',3)

    [/autoit]


    Der Pattern innerhalb der Klammern taugt aber eh nicht, um valide Emails zu filtern, außerdem wird auch der Text hinter der Email "gefangen".
    Da man davon ausgehen kann, dass die Emails auf der Seite alle valide sind, kannst du einfach folgendes benutzen:

    [autoit]

    $ergebnis = StringRegExp($sHtml, '<a href="mailto:(.*)" onclick', 3)

    [/autoit]


    Den Rest habe ich mir jetzt nicht weiter angesehen, weil du ja schreibst, dass das funktioniert...

    *edit*
    So, jetzt hab ich mir den Rest doch noch angesehen und auch einen Fehler im Namens-Pattern gefunden.
    Die Klammer muss auskommentiert werden, da diese sonst als Steuerzeichen interpretiert wird (was wieder ein fehlerhaftes Pattern produziert, weil die öffnende Klammer fehlt).
    Außerdem werden auch hier wieder alle Zeichen hinter des Namens "mitgefangen".
    So sollte es funktionieren:

    [autoit]

    $ergebnis1 = StringRegExp($sHtml, ' this\)"><span class="">(.*)&nbsp;</span>', 3)

    [/autoit]


    Sanfte Grüße :D

  • Erstmal sau fettes danke für die Rückmeldungen.

    Friesel, leider gibt er mir bei deinen Lösungsansätzen nen Fehler aus.

    Hab von deinem Lösungsansatz die Zeilen 8 und 9 abgeändert.

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    #include <Array.au3>

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

    $i=1
    $oIE = _IECreate("http://www2.dasoertliche.de/?context=11&form_name=search_nat&zbuab=40000057%2C40000064%2C40000068%2C40000067%2C40000074%2C40000075%2C40000053%2C40000065%2C40000084&buc=2244&action=56&recFrom="&$i&"&zvo_ok=1&radius=5&orderby=name&kw=Grundst%FCcksverwaltungen&page=78&buab=40000058&ttforderby=rel&ci=Hamburg", 0, 0)
    $sHtml = _IEBodyReadHTML($oIE)
    ClipPut($sHtml)

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

    $ergebnis1 = StringRegExp($sHtml, ' this\)"><span class="">(.*)&nbsp;</span>', 3)
    $ergebnis = StringRegExp($sHtml, '<a href="mailto:(.*)" onclick', 3)
    _ArrayDisplay($ergebnis1,"Ergebnis_")
    _ArrayDisplay($ergebnis,"Ergebnis")

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

    For $i=1 to 19
    FileWriteLine(@ScriptDir&"\ergebnis.txt",$ergebnis1[$i])
    Next

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

    For $p= 0 to 19
    FileWriteLine(@ScriptDir&"\ergebnis1.txt",$ergebnis[$p])
    next

    [/autoit]

    Fehlermeldung:

    Code
    C:\Users\Rageclaw666\Desktop\syf.au3 (14) : ==> Subscript used with non-Array variable.:
    FileWriteLine(@ScriptDir&"\ergebnis.txt",$ergebnis1[$i])
    FileWriteLine(@ScriptDir&"\ergebnis.txt",$ergebnis1^ ERROR
    >Exit code: 1    Time: 2.625

    reeky
    Leider hab ich die FF3.au3 nicht, hab es zwar gezogen und Eingebunden doch funktioniert dies auch nicht, er gibt mir die Error-Message aus "Can't connect to FireFox"


    Hoffe ihr könnt mir dort helfen die Fehler aus zu finden.


    EDIT 17.27h - 14.10

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    #include <Array.au3>

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

    $ready= "http://www4.dastelefonbuch.de/?bi=8&kw=Hausverwaltung&ci=Hamburg&ciid=8816&cmd=search&seed=1298105593&ort_ok=1&vert_ok=1&buab=400000&cx=-34824&cy=283796&lat=53.549813&lon=9.973249&mdest=sec1.www1%2Csec3.www3&aktion=44&sp=&mergerid=&recfrom=1&orderby=name"
    $oIE = _IECreate($ready, 0, 0)
    $sHtml = _IEBodyReadHTML($oIE)
    ClipPut($sHtml)

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

    $ergebnis1 = StringRegExp($sHtml,' this\)"><span class="">(.*)</span>',3) ;~ dies funktioniert nicht
    $ergebnis = StringRegExp($sHtml,'<a title="E-Mail" class="ico topmailpriv" href="#" rel="nofollow">([^<]+)</a>',3) ;~ So wird mir die E-Mail gefiltert
    _ArrayDisplay($ergebnis1,"Ergebnis_")
    _ArrayDisplay($ergebnis,"Ergebnis")

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

    ProcessClose("iexplore.exe")

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

    For $i=0 to 19
    FileWriteLine(@ScriptDir&"\ergebnis.txt",$ergebnis1[$i])
    Next

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

    For $p = 0 to 19
    $new = " "
    $new = $new & $ergebnis[$p] & @CRLF
    FileWriteLine(@ScriptDir&"\ergebnis.txt",$new)
    Next

    [/autoit]


    Lg
    Tak|Jochen

  • @Tak: du musst noch für den Firefox das Addon 'Mozrepl' installierten. Nach der Installation musst du darauf achten, dass das Addon aktiviert ist (Extras > Mozrepl > activate on start).

  • Friesel, leider gibt er mir bei deinen Lösungsansätzen nen Fehler aus.


    Der Fehler passiert, weil die Funktion _IEBodyReadHTML nur den Code innerhalb des <body>-Tags ausliest.
    Die gewünschten Informationen befinden sich dort aber nicht.

    Aber keine Sorge, ich hatte Langeweile und habe ein (mehr oder weniger) voll funktionsfähiges Skript zum Auslesen aller Suchtreffer geschrieben.
    Du kannst am Anfang sogar Ort und Namen eingeben.
    Wenn du ne langsame Internetverbindung hast, kann die Suche ne Weile dauern, weil jede Seite aufgerufen und durchsucht wird. Aber immerhin gibts eine Progressbar, damit's nicht zu langweilig wird und am Schluss hast du dann ein zweidimensionales Array mit allen Treffern (Name und, falls vorhaben auch die Email). Weitere Infos auszulesen wäre kein Problem...
    Da nicht jeder Eintrag auch eine Email-Adresse hat, musste ich einen etwas umständlichen Weg nehmen, indem ich pro Seite je 20 Blöcke mit den einzelnen Einträgen auslese. Sonst ist es schwer möglich, die sehr viel geringere Anzahl an Emails den Namen zuzuordnen...

    Das Skript ist einigermassen ausführlich kommentiert, aber wenn noch Fragen bleiben, frag... (*edit* Problem mit Umlauten bei Ortsnamen korrigiert und Fehlerprüfung geringfügig erweitert)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <String.au3>

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

    While 1
    $idInputTown = _StringProper(InputBox("Ort...", "Bitte Ort eingeben:", Default, Default, Default, 130)) ;==> Ersten Buchstaben groß schreiben, Umlaute werden später umgewandelt
    If $idInputTown = "" Then Exit ;==> Programmende bei leerem Input
    $idInputName = _StringProper(InputBox("Name...", "Bitte Namen eingeben:", Default, Default, Default, 130)) ;==> Ersten Buchstaben groß schreiben, Umlaute werden später umgewandelt
    If $idInputName = "" Then Exit ;==> Programmende bei leerem Input
    $aResults = _GetAll($idInputTown, $idInputName)
    If $aResults = 0 Then
    If @extended = 0 Then
    MsgBox(0, "Fehler!", "Der Ort " & $idInputTown & " wurde nicht gefunden...")
    ElseIf @extended = 1 Then
    MsgBox(0, "Fehler!", "Der Teilnehmer " & $idInputName & " in " & $idInputTown & " wurde nicht gefunden...")
    Else
    MsgBox(0, "Fehler!", "Fehlernummer: " & @extended)
    EndIf
    EndIf
    _ArrayDisplay($aResults, $idInputName & " in " & $idInputTown)
    WEnd

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

    Exit

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

    Func _GetAll($sTown, $sName)
    Local $iSiteCount = 1, $aLastPage

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

    $sHtml = BinaryToString(InetRead("http://www.dasoertliche.de/?form_name=search_nat&ci=" & _Umlaute($sTown) & "&kw=" & _Umlaute($sName), 1))
    If StringInStr($sHtml, "Der eingegebene Ort ist uns leider nicht bekannt") Then Return SetError(1, 0, 0)
    If StringInStr($sHtml, "Ortsauswahl") Then ;==> Sonderfall bei mehreren gefundenen Orten
    $aPickSite = StringRegExp($sHtml, '<a href="(http://www\d*\.dasoertliche\.de/\?form_name=search_nat.*)">' & $sTown & '</a>', 1)
    If IsArray($aPickSite) Then ;==> NUR bei 100%iger Übereinstimmung mit dem Suchbegriff (Ort)
    $sHtml = BinaryToString(InetRead($aPickSite[0], 1))
    Else ;==> hier könnte ein Auswahlfenster angezeigt werden, wenn keine 100%ige Übereinstimmung vorliegt
    ShellExecute("http://www.dasoertliche.de/?form_name=search_nat&ci=" & _Umlaute($sTown) & "&kw=" & _Umlaute($sName)) ;==> zum Debuggen, wenn kein weiterführender Link gefunden wurde
    Return SetError(1, 2, 0)
    EndIf
    EndIf
    If StringInStr($sHtml, "Ihre Suche war leider nicht erfolgreich und wir konnten keinen Treffer finden") Then Return SetError(1, 1, 0)

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

    $aTrefferAnzahl = StringRegExp($sHtml, '<div class="">Treffer&nbsp;1-\d{1,2}&nbsp;von&nbsp;<span class="">(\d*)</span></div>', 1)
    If IsArray($aTrefferAnzahl) Then
    Local $iTreffer = $aTrefferAnzahl[0]
    Local $aHits[$iTreffer][2]
    Else ;==> doppelte Absicherung (redundant)
    $aLastPage = StringRegExp($sHtml, 'recFrom=(\d{1,}).*zur letzten Seite.*', 1)
    If IsArray($aLastPage) Then
    Local $iTreffer = $aLastPage[0]
    Local $aHits[$iTreffer + 20][2] ;==> Größe des Arrays wird am Ende der Fktn genau angepasst
    Else
    Local $aHits[20][2] ;==> falls nur eine Seite gefunden wird (weniger als 21 Treffer)
    EndIf
    EndIf

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

    ProgressOn("Bitte warten!", "Ergebnisse werden geladen...", "", Default, Default, 18)

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

    Do
    $aBlock = _StringBetween($sHtml, '<div class="counter">', '</script>') ;==> Jeder Block enthält einen Eintrag(mit oder ohne Email)
    If Not IsArray($aBlock) Then Return SetError(1, 3, 0) ;==> nichts gefunden
    For $i = 0 To UBound($aBlock) - 1
    $aName = StringRegExp($aBlock[$i], '><span class="">(.*)&nbsp;</span>', 1)
    If IsArray($aName) Then
    $aHits[$i + $iSiteCount - 1][0] = $aName[0]
    Else
    Beep(1000, 100) ;==> wenns piept, hat der Ort nicht den Standard HTML Code
    EndIf
    $aEmail = StringRegExp($aBlock[$i], '<a href="mailto:(.*)" onclick', 1)
    If IsArray($aEmail) Then $aHits[$i + $iSiteCount - 1][1] = $aEmail[0]
    ProgressSet(100 * ($i + $iSiteCount - 1) / $iTreffer, "Treffer: " & $i + $iSiteCount - 1 & " von " & $iTreffer)
    ConsoleWrite($i + $iSiteCount - 1 & @CRLF)
    Next
    $iSiteCount += 20
    $aNextSite = StringRegExp($sHtml, '<a href="(http://www\d\.dasoertliche\.de/?.*)" title="zur n&auml;chsten Seite">&rsaquo;</a>', 1)
    If IsArray($aNextSite) Then
    $sHtml = BinaryToString(InetRead($aNextSite[0], 1))
    EndIf
    Until $iSiteCount > $iTreffer

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

    ProgressSet(100)

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

    If IsArray($aLastPage) Then ;==> auch redundant
    ReDim $aHits[$aLastPage[0] + UBound($aBlock) - 1][2] ;==> genaue Anzahl der Treffer ist erst am Ende bekannt, daher jetzt Array anpassen
    EndIf

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

    ProgressOff()

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

    Return $aHits
    EndFunc ;==>_GetAll

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

    Func _Umlaute($sReplace) ;==> Deutsche Umlaute umwandeln
    $sReplace = StringReplace($sReplace, "ä", "%E4")
    $sReplace = StringReplace($sReplace, "ö", "%F6")
    $sReplace = StringReplace($sReplace, "ü", "%FC")
    Return $sReplace
    EndFunc ;==>_Umlaute

    [/autoit]


    Was noch verbessert werden muss, ist auf jeden Fall das Errorhandling, aber ansonsten funkts ganz ordentlich, soweit ich das testen konnte...


    Sanfte Grüße :D

  • Ach du heiliger xDDDDD

    Ich hab grade net schlecht geguckt als ich das gesehen habe xD
    Aber es funzt, und es hilft mir sehr die Liste für meine Studien Kameraden zu vervollständigen ;)

    Ich bedanke mich recht herzlich bei Euch beiden für die Hilfe.

    Friesel:
    Klar sind dort nicht alle E-Mail Adressen vorhanden, aber so kann ich schon einige in Excel überführen und den Rest selbst nachschlagen. Aber dadurch das die Namen schon alle vorhanden sind, hat mir dein Script schon richtig gut geholfen und einiges an arbeit abgenommen.

    Lg und FETTES Danke an euch beide
    Tak|Jochen