[Python] Vergelijken van strings geeft vreemd resultaat

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Hallo Tweakers,

Probeer in Python3 een script te schrijven dat om de minuut middels een cronjob draait om te kijken of er veranderingen zijn op een bepaalde webpagina. Het script dumpt tijdens de laatste run de html als string naar een file, en bij de tweede run wordt de in memory html dump vergeleken tegen de string in de dumpfile.

code:
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
32
33
34
import urllib.request
import time

with urllib.request.urlopen(
        'https://www.pagina.nl/') as response:
   html = response.read()

while True:

   try:
      # probeer dumpfile te openen waar pagina laatste keer was gedumpt
      f = open("output.txt","r")
      last = f.read()
      print(len(last))
      print(last)
      print(len(html))
      print(html)
      if last != html:
         # als in memory html dump verschilt van html in laatste dumpfile, overschrijf dumpfile 
         # stuur email dat pagina is gewijzigd
         print("Page update found!")
        mail("mailadress@gmail.com,"change to page")
         f = open("output.txt", "w")
         print(html, file=f)
         f.close()
         break

   except IOError:
     #als dumpfile niet gevonden is, maak dan nieuw aan
      print("File does not exist, creating new..")
      f = open("output.txt", "w")
      print(html, file=f)
      f.close()
      break


waar het fout gaat is als ik de html in de variabele vergelijk met de html in de dumpfile. Als ik de inhoud print van de dumpfile en de html in de variabele, dan zie ik exact dezelfde string, ook met dezelfde lengte. Vreemd genoeg blijft de condition valideren dat ze niet hetzelfde zijn. Ook als ik de lengte van de twee verschillende string print krijg ik verschillende waarden. Dit is erg basic, python3 syntax is nieuw voor mij en ik snap dit gedrag niet. Iemand een idee?

[ Voor 4% gewijzigd door Xanthium op 12-02-2020 13:19 ]

Alle reacties


Acties:
  • +1 Henk 'm!

  • Trinsec
  • Registratie: Februari 2003
  • Laatst online: 11:00

Trinsec

Huffi-Muffi-Guffi

Kan je die code tussen code-tags plaatsen? Python is erg spatie-gevoelig en dat leest dus behoorlijk rot.

when the Darkness fell upon us
when the Evil Ones came!
Creatures from the darkest pits of hell they were.
Trinsec's Journal


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 13:03
Xanthium schreef op woensdag 12 februari 2020 @ 13:17:
Als ik de inhoud print van de dumpfile en de html in de variabele, dan zie ik exact dezelfde string, ook met dezelfde lengte. [..] Ook als ik de lengte van de twee verschillende string print krijg ik verschillende waarden.
Is de lengte nou wel of niet hetzelfde? Misschien bedoel je dat de geprinte strings even lang lijken maar dat de daadwerkelijke lengte (volgens len()) verschilt? Kijk eens naar de end parameter van print(). File objects hebben trouwens ook een write-methode.

Acties:
  • +1 Henk 'm!

  • Trinsec
  • Registratie: Februari 2003
  • Laatst online: 11:00

Trinsec

Huffi-Muffi-Guffi

Okay, pin me er niet op vast, maar de last != html doet meer dan alleen de lengte en tekst-inhoud bekijken. De 'type()' van html is <class 'bytes'> en de 'type()' van last is <class 'str'>. Dat is dus al ongelijk, tenzij je de html overzet naar str.

Het handigste is waarschijnlijk gewoon om 'html = str(response.read())' te doen.
Dan krijg je nu mogelijk een ander probleem, len() is nu een newline verschil omdat je print() standaard met een newline komt. Even een optie daar toevoegen dat print() geen newline schrijft naar de file, en het zou kunnen werken.

when the Darkness fell upon us
when the Evil Ones came!
Creatures from the darkest pits of hell they were.
Trinsec's Journal


Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Trinsec schreef op woensdag 12 februari 2020 @ 13:49:
Okay, pin me er niet op vast, maar de last != html doet meer dan alleen de lengte en tekst-inhoud bekijken. De 'type()' van html is <class 'bytes'> en de 'type()' van last is <class 'str'>. Dat is dus al ongelijk, tenzij je de html overzet naar str.

Het handigste is waarschijnlijk gewoon om 'html = str(response.read())' te doen.
Dan krijg je nu mogelijk een ander probleem, len() is nu een newline verschil omdat je print() standaard met een newline komt. Even een optie daar toevoegen dat print() geen newline schrijft naar de file, en het zou kunnen werken.
duidelijk! ga ik checken. Blijkbaar gebeurt er onderwater meer dan wat de string outputs mij doen geloven hier..

Acties:
  • 0 Henk 'm!

  • Trinsec
  • Registratie: Februari 2003
  • Laatst online: 11:00

Trinsec

Huffi-Muffi-Guffi

Xanthium schreef op woensdag 12 februari 2020 @ 13:54:
[...]


duidelijk! ga ik checken. Blijkbaar gebeurt er onderwater meer dan wat de string outputs mij doen geloven hier..
Jup, dat heeft mij al heel wat hoofdbrekens gekost. Ik heb dat gedoe nog steeds niet 100% door, maar ik vermoed dat dit hier dus ook het geval is. Succes ermee! :)

when the Darkness fell upon us
when the Evil Ones came!
Creatures from the darkest pits of hell they were.
Trinsec's Journal


Acties:
  • 0 Henk 'm!

  • Aragnut
  • Registratie: Oktober 2009
  • Laatst online: 13:13
echo de variabelen uit (liefst met ++ en == eromheen). Kan zomaar zijn dat er nog een endline character bij zit op 1 van de 2.

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 13:03
Ik zou dan binary mode gebruiken voor het lezen/schrijven van je dumpfile (dus 'b' bij mode voor open()) en, zoals eerder gezegd, gewoon
Python:
1
f.write(html)
i.p.v. moeilijk doen met string conversies en extra print-argumenten.

Acties:
  • +1 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 13:27
De meeste html pagina zijn utf-8 en als je dat wegschrijft naar een gewone file dan schrijft hij het als ascii weg en is het dus verandert.

Twee adviezen:
Gebruikt de requests library in plaats van urllib en gebruik voor de file ofwel codecs ofwel ofwel io zodat je het als utf-8 kunt wegschrijven.

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.

Pagina: 1