@djangofish: Ein paar Anmerkungen zum Quelltext:
Von den importierten Modulen wird mehr als die Hälfte überhaupt gar nicht verwendet. Der Sternchen-Import ist unschön.
Der konkrete Datentyp hat in Namen nichts zu suchen. Dann kann man den Typ des Wertes nicht mehr ändern ohne dass man den Namen ändern muss oder irreführende Namen im Quelltext hat. Das läuft auch dem „duck typing” zuwider.
Abkürzungen und komische Wortschöpfungen wie `listSubofinterest` sind keine gute Idee weil sie beim Leser mehr Fragen aufwerfen als beantworten.
Code auf Modulebene der keine Konstanten definiert wird spätestens dann unsauber wenn man anfängt den Code auf Funktionen zu verteilen.
`listFeed` wird etwas umständlich gefüllt. Es gibt Listenliterale, man braucht nicht für jedes Element einen Methodenaufruf. Das verleiht dem Quelltext zusätzlich zu der ``<<``-Operatorüberladung irgendwie einen C++-touch.
Auslesen der Feeds und erstellen der HTML-Seite ist ja *fast* getrennt in dem Skript, nur das `page` viel zu früh erstellt wird. Man sollte Namen in der Nähe des Codes definieren wo sie dann auch verwendet werden und nicht Quelltext für einen Arbeitsschritt der etwas ganz anderes tut dazwischen platzieren.
Aus dem Quelltext wird, zumindest mir, nicht wirklich klar was das zweite Element in denn Listen bedeuten soll welche Feeds beschreiben. Weil ``feed[1]`` halt nicht wirklich etwas über die Bedeutung verrät. Statt nichtssagender Indexwerte hätte man hier in der Schleife schon die beiden Elemente an jeweils einen aussagekräftigen Namen binden können.
In der Feed-Auswertung sind die Namen `entries`, `es`, `entry1` und `entry` sehr verwirrend. Ich bin mir auch fast sicher das tut nicht das was es soll. Sollte es doch, so erscheint der Code ziemlich verworren und unsinnig. Das mit dem Test auf 'subtitle' in der Schleife macht keinen Sinn. Ebenso ist das Prüfen auf die interessanten Worte im Titel fehlerhaft, weil für *jeden* Treffer ein Ergebniseintrag erstellt wird. Wenn also die Schlagzeile „Obame trifft Merkel” lautet, wird der gleiche Feed-Eintrag *zweimal* hintereinander dem Ergebnis hinzugefügt. Das erscheint mir nicht besonders sinnvoll. Der Test mit ``find(…) != -1`` ist umständlich ausgedrück — dafür gibt es den ``in``-Operator.
Beim Erstellen der HTML-Seite sind die Namen wieder fast durchweg unzureichend. Beispielsweise `mytab` — `my` sagt im Grunde nichts aus und ist nur ein unnötiges Füllwort und `tab` hat eine Bedeutung, nämlich Karteikartenreiter, was ein übliches UI-Element in HTML ist, und damit ist der Name irreführend wenn er für eine Tabelle steht.
Das ganze könnte dann so aussehen:
Code: Alles auswählen
#!/usr/bin/env python
import feedparser
import pyh
def main():
feeds = [
['http://www.spiegel.de/schlagzeilen/index.rss', 1],
['http://www.welt.de/?config=feeds_startseite', 2]
]
results = []
subject_keywords = ['e', 'o', 'Obama', 'Merkel', 'Assad']
for feed_url, some_magic_number in feeds:
feed = feedparser.parse(feed_url)
feed_title = feed['feed']['title']
for entry in feed.entries:
#
# TODO Really create one result entry for each matching subject?
#
for subject in subject_keywords:
if subject in entry['title']:
print entry.keys()
results.append(
[
str(some_magic_number),
feed_title,
subject,
entry.title,
entry.get('description', ''),
entry.link
]
)
page = pyh.PyH('My News')
feed_table = page << pyh.table()
for row in results:
table_row = feed_table << pyh.tr()
for cell_content in row:
table_row << pyh.td(cell_content.encode('utf-8'))
page.addJS('http://code.jquery.com/jquery-1.9.1.js')
page << pyh.script("$(':header').css({ background:'red', color:'black' });")
page.printOut('test.html')
if __name__ == '__main__':
main()
Wie bist Du eigentlich auf PyH gekommen? Die Namen und das überladen von ``<<`` sieht mehr nach C++ als nach Python aus. Das ist Version 0.0.1 von vor drei Jahren und seitdem hat sich da auch nichts mehr getan. Man kann mit verbreiteren Modulen/Packages wie `BeautifulSoup` oder `lxml.html` auch programmatisch HTML erzeugen. Wobei ich das letztendlich eher nicht machen würde, sondern eine Template-Engine wie beispielsweise Jinja2 verwenden würde. Damit kann man einfacher die Ausgabe gestalten als mit Code in einer Programmiersprache.