Leider kann ich per Excel-Web-Abfrage die Umfrage-Ergebnisse nicht separat downloaden.Musst du dich noch immer mit meiner alten Excel-Datei für die DSA4-Abenteuerauswertungen herumärgern, Thallion? Du Ärmster! ;)
Diese werden nicht als Tabelle erkannt.
Hat jemand vielleicht eine Lösung?
Wollt ihr überhaupt einen Thread mit Auswertungen?
Soll es in Zukunft bei der Schulnotenvergabe bleiben?
import urllib.request
from bs4 import BeautifulSoup
from collections import namedtuple
from operator import attrgetter
Produkt = namedtuple('Produkt','name id url Stimmen Durchschnitt')
Produkte = []
baseurl = "http://forum.splittermond.de/index.php?topic=%d.0"
bewertungsthreads = [1676,1418,2003]
def newrow(td):
return '[tr][td]' + str(td)
def newcell(row,td):
return row + '[/td][td]' + str(td)
def endrow(row):
return row + '[/td][/tr]\r\n'
def bbcode(tag, string, value = None):
if value:
return'['+tag+'='+value+']'+string+'[/'+tag+']'
else:
return'['+tag+']'+string+'[/'+tag+']'
def bbcodeurl(urlstring,urlname):
return bbcode('url',urlname, urlstring)
#return '[url='+urlstring+']'+urlname+'[/url]'
def bbbold(text):
return bbcode(tag='b', string = text)
def bbtt(text):
return bbcode(tag='tt', string = text)
def createrow(field1, field2, field3, field4):
tablerow = newrow(field1)
tablerow = newcell(tablerow,field2)
tablerow = newcell(tablerow,field3)
tablerow = newcell(tablerow,field4)
tablerow = endrow(tablerow)
return tablerow
for threadid in bewertungsthreads:
url=baseurl % threadid
page=urllib.request.urlopen(url)
soup = BeautifulSoup(page.read())
Produktname = soup.find('title').string.split('/')[0].strip()
polls = soup.find('dl',{'class':'options'})
options = polls.findAll('dt',{'class':'middletext'})
votes = polls.findAll('span',{'class':'percentage'})
ergebnis = dict(zip([[int(s) for s in option.string.split() if s.isdigit()][0] for option in options], [int(vote.string.split(' ')[0]) for vote in votes]))
try:
average = str(round(sum(k*v for k,v in ergebnis.items()) / sum(v for k,v in ergebnis.items()),2))
except ValueError:
average = 'No votes yet'
Produkte.append(Produkt(Produktname, threadid, url, str(sum(v for k,v in ergebnis.items())), average))
table = '[table]\r\n'
header = createrow(bbbold('Platz')+bbtt(' '),bbbold('Bewertung ')+bbtt(' '),bbbold('Stimmen ')+bbtt(' '),bbbold('Produkt')+bbtt(' '))
table += header
for index, element in enumerate(sorted(Produkte, key=attrgetter('Durchschnitt'))):
row = createrow(index+1,element.Durchschnitt,element.Stimmen,bbcodeurl(element.url,element.name))
table += row
table += '[/table]'
print(table)
Platz | Bewertung | Stimmen | Produkt |
1 | 1.55 | 58 | Grundregelwerk (http://forum.splittermond.de/index.php?topic=1676.0) |
2 | 1.69 | 110 | Weltenband (http://forum.splittermond.de/index.php?topic=1418.0) |
3 | 2.0 | 1 | Der Fluch der Hexenkönigin (http://forum.splittermond.de/index.php?topic=2003.0) |
ein-zwei mal pro Monat eine neue ID in die Liste der Threads einzufügen und CTRL+F11, CTRL+C, CTRL+V zu drücken ist jetzt nicht so wild. ;)Ungefähr so etwas mag sich auch Alex der Große gedacht haben, als er einst den Plan ersann, die Welt zu erobern. :) Ich werde Dich in 12 Jahren noch einmal darauf ansprechen. :)