Topic: Mechanize e Beautifulsoup leggono le ore con delay  (Letto 118 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline vaeVictis

  • python unicellularis
  • *
  • Post: 8
  • Punti reputazione: 0
    • Mostra profilo
Mechanize e Beautifulsoup leggono le ore con delay
« il: Gennaio 10, 2019, 19:13 »
Ciao a tutti.

Come premesso nel titolo ho un problema nel recupero e parsing di una pagina HTML.
In breve, rispetto al codice HTML che posso vedere con le apposite funzioni di Chrome, il mio programma recupera il codice HTML della pagina, ma le ore in un determinato campo vengono sfasate con un delay negativo di un'ora.

Sono giorni che ci sto sbattendo la testa e non riesco proprio a capire da cosa possa dipendere.
Spero possiate aiutarmi a capire da cosa possa dipendere.

Grazie in anticipo :)

Vi lascio il link sito in questione, che è questo calendario economico
E il codice con cui prelevo tutte le informazioni sui singoli eventi economici, in versione ridotta in modo che possiate vedere l'orario e il nome dell'evento per poterlo poi (se avrete la pazienza di aiutarmi) vedere sul sito al link qui sopra:


from __future__ import print_function
from bs4 import BeautifulSoup

import regex as re
import mechanize
from datetime import datetime

URL_PAGE = 'https://www.myfxbook.com/forex-economic-calendar'

# recupero codice html     
br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]       
html_content = br.open(URL_PAGE).read()

# preparazione della zuppa
soup = BeautifulSoup(html_content, "html.parser")

#regex compilate per l'estrazione dei dati di interesse
cal_row_re  = re.compile(r'^calRow.*')              # <-- nome dell'evento
date_re     = re.compile(r'\w+\s?\d+:\d+')         # <-- data

# trovo tuttoi gli eventi che mi interessano
CalEvents = soup.find_all(id=cal_row_re)

# per ogni evento stampo data e nome separati da punto e virgola
for singleEvent in CalEvents:
    date = singleEvent.find(text=date_re).strip()
    eventName = singleEvent.find(class_='noUnderline').get_text().strip()
    print(date, eventName, sep = ';')


« Ultima modifica: Gennaio 10, 2019, 19:15 da vaeVictis »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.851
  • Punti reputazione: 9
    • Mostra profilo
Re:Mechanize e Beautifulsoup leggono le ore con delay
« Risposta #1 il: Gennaio 10, 2019, 21:51 »
Stai sbattendo la testa da giorni sui fusi orari? Quel calendario usa il fuso di Londra (GMT). Poi a un certo punto quando lo carichi sul browser, javascript chiama getTimeZoneOffset() https://www.w3schools.com/jsref/jsref_gettimezoneoffset.asp, aggiunge l'offset e tu vedi l'ora italiana. I tuoi tool, invece, non eseguono quella funzione, o non riescono a leggere l'offset, va a sapere. Che ti importa? Puoi comunque farlo tu a mano dopo, direi.

Offline vaeVictis

  • python unicellularis
  • *
  • Post: 8
  • Punti reputazione: 0
    • Mostra profilo
Re:Mechanize e Beautifulsoup leggono le ore con delay
« Risposta #2 il: Gennaio 10, 2019, 22:32 »
Stai sbattendo la testa da giorni sui fusi orari? Quel calendario usa il fuso di Londra (GMT). Poi a un certo punto quando lo carichi sul browser, javascript chiama getTimeZoneOffset() https://www.w3schools.com/jsref/jsref_gettimezoneoffset.asp, aggiunge l'offset e tu vedi l'ora italiana. I tuoi tool, invece, non eseguono quella funzione, o non riescono a leggere l'offset, va a sapere. Che ti importa? Puoi comunque farlo tu a mano dopo, direi.

Lo faccio a mano ma salta completamente gli eventi che ricadono nel "giorno prima". Ovvero tutti quelli da mezzanotte all'una. Intendo dire che nel codice html ottenuto con mechanize salta  gli eventi del primo giorno compresi in quell'orario. Non li vede proprio.
Il problema è questo.
« Ultima modifica: Gennaio 10, 2019, 22:39 da vaeVictis »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.851
  • Punti reputazione: 9
    • Mostra profilo
Re:Mechanize e Beautifulsoup leggono le ore con delay
« Risposta #3 il: Gennaio 11, 2019, 12:58 »
ah, ecco: dirlo subito...
Ma intendi "da mezzanotte all'una" di qua, o GMT? Non so esattamente come funziona mechanize (mai usato), ma potresti provare a impostare manualmente il locale prima di invocare mechanize, ma non credo che poi getTimeZoneOffset sia locale-aware (penso che chieda direttamente al sistema operativo... e non credo che tu voglia cambiare il locale del sistema operativo per questo).
D'altra parte, non saprei... ma non puoi provare a prelevare direttamente l'html della pagina (con request, o al limite anche solo con urllib) senza pretendere di eseguire il javascript, e vedere quello che ottieni?