Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Python]Opeenvolgende items in een list vervangen

Pagina: 1
Acties:

  • hydrargyrum
  • Registratie: December 2012
  • Laatst online: 11-11 12:04
Hallo Tweakers,
Ik ben bezig met mijn lesrooster te gebruiken in een python script. Gezien dat deze site erg simpel is opgebouwd heb ik gebruik gemaakt van een html-scraper.
Nu is mijn lesrooster niet altijd constant. Gelukkig is er een verband te zien tussen een tussenuur en het aantal \n dat er meegestuurd word door urllib.

Bij een tussenuur zijn er 4 \n tags achter elkaar, en normaal gezien maar 2, tussen iedere rij in. Deze \n tags heb ik vervangen door het ~ symbool.

Nu is mijn vraag: hoe kan ik ervoor zorgen dat 4 opeenvolgende tags worden vertaald naar iets als tussenuur, en als het er 2 achter elkaar zijn weglaten.

Dit is de code die ik al heb:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from html.parser import HTMLParser
import urllib.request
website=urllib.request.urlopen("http://roosters5.gepro-osi.nl/roosters/rooster.php?leerling=124744&type=Leerlingrooster&afdeling=4v&tabblad=0&school=590")
website_html=str(website.read())
website=['']
class TableParser(HTMLParser):
     def __init__(self):
          HTMLParser.__init__(self)
          self.in_td = False
     
     def handle_starttag(self, tag, attrs):
         if tag == 'td':
             self.in_td = True
     
     def handle_data(self, data):
         if self.in_td:
            global website
            if "\\n" in data or "\\\n" in data:
                 data="~"
            website.append(data)
    
     def handle_endtag(self, tag):
        self.in_td = False

p = TableParser()
p.feed(website_html)
counter=0
index=0
del website[:website.index("1e uur")]
del website[website.index("Afdrukken"):]
print(website)

en dit is de output:
['1e uur', '~', '~', 'jns', '065', 'wisB', 'F', '~', '~', 'ker', '018', 'in', 'C', '~', '~', '~', '~', 'kel', '081', 'biol', 'C', '~', '~', 'jns', '061', 'wisB', 'F', '2e uur', '~', '~', 'sto', '095', 'nat', 'E', '~', '~', '~', '~', 'jns', '060', 'wisB', 'F', '~', '~', 'hab', '083', 'anw', '~', '~', 'bmj', '053', 'entl', 'J', '3e uur', '~', '~', '~', '~', 'wes', '018', 'ckv', 'A', '~', '~', 'zew', '057', 'fatl', 'B', '~', '~', 'ker', '018', 'in', 'C', 'kel', '081', 'biol', 'C', '~', '~', 'smol', '024', 'lo', 'brg', '024', 'lo', '4e uur', '~', '~', 'tws', '086', 'schk', 'A', '~', '~', 'sto', '095', 'nat', 'E', '~', '~', 'hab', '083', 'anw', '~', '~', 'wes', '018', 'ckv', 'A', '~', '~', 'smol', '024', 'lo', 'brg', '024', 'lo', '5a', '~', '~', '~', '~', 'vld', '064', 'lv', '~', '~', 'geu', '059', 'netl', '~', '~', 'geu', '059', 'netl', '~', '~', '5b', '~', '~', '~', '~', '~', '~', '~', '~', '~', '~', '6e uur', '~', '~', 'mdk', '081', 'nlt', 'D', '~', '~', 'geu', '059', 'netl', '~', '~', 'ker', '018', 'in', 'C', 'kel', '081', 'biol', 'C', '~', '~', 'sto', '095', 'nat', 'E', '~', '~', '7e uur', '~', '~', 'jns', '060', 'st', 'D', '~', '~', '~', '~', 'mdk', '084', 'nlt', 'D', '~', '~', '~', '~', '8e uur', '~', '~', '~', '~', 'tws', '084', 'schk', 'A', '~', '~', 'bmj', '006', 'entl', 'J', '~', '~', 'zew', '057', 'fatl', 'B', '~', '~', '9e uur', '~', '~', '~', '~', '~', '~', '~', '~', '~', '~', '10e uur', '~', '~', '~', '~', '~', '~', '~', '~', '~', '~', '11e uur', '~', '~', '~', '~', '~', '~', '~', '~', '~', '~']

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Gewoon door de array lopen en bij element n ook even kijken wat n+1, n+2 en n+3 zijn en die evt verwijderen?

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Ik zou de hele lijst die je hebt in je output joinen met een bepaald caracter, bijvoorbeeld |, en dan alle elementen ~|~|~|~| vervangen door tussenuur en vervolgens alle ~|~| door niks.

Dus zoiets:
Python:
1
website_filtered = ('|'.join(website) + '|').replace('~|~|~|~|', 'tussenuur').replace('~|~|', '').split('|').


Mooi is het niet. ;)

[ Voor 27% gewijzigd door armageddon_2k1 op 10-06-2014 08:42 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


  • hydrargyrum
  • Registratie: December 2012
  • Laatst online: 11-11 12:04
armageddon_2k1 schreef op dinsdag 10 juni 2014 @ 08:39:
Ik zou de hele lijst die je hebt in je output joinen met een bepaald caracter, bijvoorbeeld |, en dan alle elementen ~|~|~|~| vervangen door tussenuur en vervolgens alle ~|~| door niks.

Dus zoiets:
Python:
1
website_filtered = ('|'.join(website) + '|').replace('~|~|~|~|', 'tussenuur').replace('~|~|', '').split('|').


Mooi is het niet. ;)
Oeh, die is inderdaad niet echt mooi, maar het werkt wel. Het engiste wat ik gedaan heb is ~|~|~|~| vervangen door ~|~|~|~, en nu werkt het perfect. Bedankt voor jullie hulp.