Internetseite als E-Mail schicken

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Hallo!

Ich brauche ein Programm, das mir den HTML-Code einer Internetseite als E-Mail schickt.
So sieht e bis jetzt aus:

Code: Alles auswählen

from BeautifulSoup import *
from urllib2 import urlopen
source = urlopen("http://www.google.de")
text = BeautifulSoup(source)

import smtplib

absender = 'blub@blub.de'
adressat = 'blub@blub.de'

server = smtplib.SMTP('smtp.xxx.com')
server.login('xxx',xxx')
server.sendmail(absender,adressat,text)
server.quit()

Ich bin schon sehr froh, dass ich die E-Mails an sich verschicken kann :)
Doch ist "text" irgendwie kein richtiger String und kann nicht als Mail verschickt werden. Ich kenne die internen Abläufe von "BeautifulSoup" nicht.
Was habe ich falsch gemacht / was fehlt?


Danke schonmal!.
Gruß
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, text ist eben kein Text sondern ein BeautifulSoup-Objekt. Was willst du denn eigentlich machen? Die Seite per Mail schicken? Dazu brauchst du kein BS.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Was wolltest Du denn machen? `BeautifulSoup` ist ein Parser, der das HTML in einen Objektbaum verwandelt und Methoden auf den Knoten bietet um bestimmte Stellen zu finden und zu extrahieren. Du machst damit dann aber überhaupt nichts.

Wenn Du die Seite 1:1 verschicken willst, dann lass `BeautifulSoup` einfach komplett weg.

Und dann müsste so eine Mail eine "MIME multipart message" sein, mit reinem Text als ersten Teil. Und bei Deinem `text` müsstest Du noch irgend wie den Typ ('text/html') setzen, damit beim Empfänger nicht der HTML-Quelltext angezeigt wird. Und ich denke Du musst dafür sorgen das `text` so kodiert ist, dass nur ASCII-Zeichen drin vorkommen, also ggf. Base64 oder "quoted printable". Falls `smtplib` das nicht für Dich macht.
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Also ich kenn mich mit Python erst grundlegend aus.
Wie kann ich denn die Seite ohne BeautifulSoup verschicken oder wie bekomme ich die seite in eine Variable?
Am besten wäre es natürlich, wenn ich die Seite nach dem Verschicken 1:1 sehe.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also den Quelltext bekommst du so:

Code: Alles auswählen

url = urlopen("http://www.google.de")
source = url.read() #in source ist nun der quelltext
url.close()
Dann zum Mail versenden empfehle ich dir das Modul simplemail von Gerold:
http://www.python-forum.de/topic-3158.html

Hier ist auch beschrieben wie du ein HTML-Mail versendest:
http://www.python-forum.de/post-22458.html#22458

Gruss
Benutzeravatar
phxx
User
Beiträge: 31
Registriert: Freitag 5. Mai 2006, 19:47

Damit Du sie auch wirklich eins zu eins sehen kannst müssen ja auch noch Bilder und Stylesheets sowie evtl Javascript-Dateien mit heruntergeladen werden und in die Email integriert werden. Ich denke, dass wird schon sehr viel Aufwendiger als Du Dir das im moment vorstellst.

Falls Du ein Linuxsystem verwendest, schau Dir doch mal die Manpage von "wget" an, die kann Internetseiten bis zu einer gegebenen Tiefe herunterladen und so modifizieren, dass Sie offline betrachtbar ist (inkl Stylesheet und Bilder). Die heruntergeladenen Sachen kannst Du dann ja mit Python zippen und versenden.
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Danke für die Antworten!
Ich habe es jetzt hinbekommen, doch habe ich mir überlegt, dass es doch sinnvoller wäre, wenn ich mir nur eine Zeile raussuche, da ich die nur brauche. Wie das Suchen ansatzweise funktioniert habe ich gerade rausgefunden doch gibt es das gleiche Problem wie mit BeautifulSoup.
Der entstandene Variabelntyp scheint irgendwie verändert zu sein, er ist weder eine Liste noch ein String, sodass ich ihn nicht verschicken kann.

So sieht das Programm bis jetzt aus:

Code: Alles auswählen

from urllib2 import urlopen
from re import findall

url = urlopen("http://www.rrr.de")
text = url.read()
url.close()
text=findall('blub',text)

print text

import smtplib
import time

absender = 'blub@blub.de'
adressat = 'rrr'

server = smtplib.SMTP('smtp.rrr.com')
server.login('rrr','rrr')
server.sendmail(absender,adressat,text)
server.quit()
Wie kann ich das in einen String (zurück)umwandeln, sodass ich es verschicken kann?



Gruß
Paul
BlackJack

Den Typ kann man mit der `type()`-Funktion heraus finden und es ist eine Liste, die aber nicht die Zeile(n) enthält, sondern die Treffer des Musters. Da dass im Grunde ein "festes" Muster ist, gibt's immer nur das Muster als Ergebnis(se):

Code: Alles auswählen

In [107]: text = 'a blah b\nc blub d\ne ... f\nnoch ein blub\n'

In [108]: print text
a blah b
c blub d
e ... f
noch ein blub


In [109]: re.findall('blub', text)
Out[109]: ['blub', 'blub']

In [110]: type(re.findall('blub', text))
Out[110]: <type 'list'>
Du müsstest das Muster also mindestens so erweitern, dass der Rest der Zeile auch erkannt wird:

Code: Alles auswählen

In [111]: re.findall('.*blub.*', text)
Out[111]: ['c blub d', 'noch ein blub']
Wenn Du nur die erste Zeile dieser Art treffen willst, dann ist `findall()` natürlich etwas Overkill.

Code: Alles auswählen

In [115]: re.search('.*blub.*', text).group(0)
Out[115]: 'c blub d'
Letztendlich solltest Du etwas gegen Deinen Nicht-Programmierer-Status tun, wenn Du weiter mit Python arbeiten möchtest. Zum Beispiel das Tutorial in der Dokumentation durcharbeiten.
Antworten