Pagina 1 di 1

[Risolto] [Python] Stranezza nell'ora letta dal codice html

Inviato: lunedì 7 gennaio 2019, 21:23
da vaeVictis
Ciao a tutti.

Sto sperimentando una "stranezza" nello scraping di info da un sito (tutta roba che si può fare, ci tengo a specificarlo data la vastità di quello che si può fare con lo scraping).

In parole povere, leggo il codice html di un sito con mechanize.
Successivamente con BeautifulSoup analizzo la struttura del codice e prendo alcune cose che mi interessano.

Tutto a posto... tranne che per l'ora.
Cambia tutte le ore lette: rispetto all'ora che compare nel codice html, mi viene letto come se fosse un'ora indietro. Nel senso che se sul sito mostra le 8 il mio programma la vede come fossero le 7.

Ho fatto l'analisi del codice con gli strumenti di Chromium.
Ho provato a fare il parse del codice html letto da file dopo averlo messo a mano e aver controllato le ore.
Ma niente da fare.

Avrei bisogno di una mano
(e anche di una nuova gamba di legno :D )

Grazie in anticipo
:ciao:

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: martedì 8 gennaio 2019, 5:37
da nuzzopippo
Anche confessando che non ho la più pallida idea di ciò che Ti serve, la butto li : Fuso orario?

Dico ciò perché mi sono accorto, da molto tempo, che l'orario riportato da questo forum per un mio intervento è spostato di un'ora rispetto all'inserimento.

Forse l'hai considerato già ma personalmente vedrei se mi riesce di trovare i riferimenti GTM adottati nel sistema consultato e compensare ... come ciò possa essere fatto non ne ho idea al momento.
Altra possibilità correlata : non è che i processi con i quali fai lo "scraping" (cu fu?) compensano un orario considerato GTM con le impostazioni del Tuo sistema?

P.S. - letto su wikipedia cosa si definisce scraping :)

[Edit] con quanto sopra, intendo si verifichi un caso del genere :

Codice: Seleziona tutto

>>> orario = datetime.datetime.now().time()
>>> orarioutc = datetime.datetime.utcnow().time()
>>> print(orario, orarioutc)
08:23:23.339861 07:24:03.112657
>>> 
... ho dovuto rileggermi la docs prima di poterlo esemplificare :D

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: martedì 8 gennaio 2019, 10:29
da vaeVictis
Appena ho un attimo scendo in cambusa e ti posto un esempio di codice.
(comunque ti avevo capito anche senza il p.s. :) )

edit: a pensarci meglio, non posso postare il codice perché dovreste installare BeautifulSoup per poterlo far girare :(

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: martedì 8 gennaio 2019, 13:14
da nuzzopippo
vaeVictis [url=https://forum.ubuntu-it.org/viewtopic.php?p=5106567#p5106567][img]https://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:...edit: a pensarci meglio, non posso postare il codice perché dovreste installare BeautifulSoup per poterlo far girare :(
beh ... anche se lanciare un test aiuta, la logica è logica e c'è speranza la docs possa dare indicazioni ... ammesso di riuscire ad individuare un probabile punto critico.

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: mercoledì 9 gennaio 2019, 7:16
da vaeVictis
Allora, ho ridotto molto il codice al fine di stampare a schermo solo la data e il nome dell'evento (avviando il programma si capisce che intendo).
Per avviarlo serve installare due pacchetti:

Codice: Seleziona tutto

sudo apt-get  install python-bs4
sudo apt-get  install python-mechanize
Il codice è:

Codice: Seleziona tutto

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
#dal singolo evento (estratto con la prima regex)
cal_row_re  = re.compile(r'^calRow.*')
date_re     = re.compile(r'\w+\s?\d+:\d+')         # <-- data

CalEvents = soup.find_all(id=cal_row_re)

for singleEvent in CalEvents:
    date = singleEvent.find(text=date_re).strip()
    eventName = singleEvent.find(class_='noUnderline').get_text().strip()
    print(date, eventName, sep = ';')
Confrontando quello che esce con le righe visualizzate sul browser aprendo il link di cui faccio lo scraping (che è nella variabile URL_PAGE).

Se hai voglia di lanciarlo e capire che succede... io ci sto diventando stupido.

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: mercoledì 9 gennaio 2019, 8:58
da nuzzopippo
uhmm ... il "senso" del codice si capisce ma c'è di roba da "leggere" prima di potermi fare un'idea attendibile, mai fatto operazioni del genere in alcun linguaggio e mai utilizzato quelle librerie.
Spero nel fine settimana di riuscire a prepararmi un virtualenv e fare una prova, giusto per capire cosa esce.

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: mercoledì 9 gennaio 2019, 9:15
da vaeVictis
Aspetta, che ti posto un esempio più semplice con lettura di un codice HTML ridotto e da file testuale

edit:
nel mentre io sto per impazzire appresso a questa stranezza.
È proprio strano. Nel codice html leggo una cosa e nel parsing un'altra :muro:

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: venerdì 11 gennaio 2019, 13:26
da nuzzopippo
Ciao, ho guardato il codice della pagina da Te indicata, in particolare ho notato una notevole quantità di javascript.

In ricerche varie fatte per capire come indicare i dati della località di partenza di una richiesta url, mi sono imbattuto in questo post di stackowerflow, in particolare, vi ho letto :
The website is probably using JavaScript to render the page which BeautifulSoup doesn't know how to run , you'll need to use something like Selenium to load the page in an actual browser
ne sono tutt'altro che certo ma, se ho interpretato bene, potrebbe essere proprio la mancata interazione di BeautifulSoup con tali script la possibile fonte dei problemi che riscontri. Comunque ho ritenuto valesse la pena di segnalarti il trafiletto in citazione.

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: venerdì 11 gennaio 2019, 13:36
da Sam9999
Potrebbe essere collegato al problema di data che si evidenzia anche fra ubuntu e windows in dual boot?

Come risolvere la differenza di orario fra Ubuntu e Windows 10 in dual boot

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: venerdì 11 gennaio 2019, 16:25
da nuzzopippo
Sam9999 [url=https://forum.ubuntu-it.org/viewtopic.php?p=5107322#p5107322][img]https://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Potrebbe essere collegato al problema di data che si evidenzia anche fra ubuntu e windows in dual boot?
beh ... python distingue l'ora locale di sistema da quella UTC (vedi la mia prima risposta in questo post) ma senza analizzarsi il sorgente delle librerie implicate non credo possa escludersi a priori.
In ogni caso credo sia improponibile, dal lato "utilizzatore", prevederela modifica delle impostazioni di sistema per una singola applicazione.

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: sabato 12 gennaio 2019, 9:49
da vaeVictis
Ci avevo pensato ma non è cambiato nulla.
Ora riprovo a vedere se dipende da questo.

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: sabato 12 gennaio 2019, 17:05
da nuzzopippo
Riferisci al javascript?

Oggi l'ho dedicato all'argomento, picchiandomi con venv ed, alla fine riuscendo a lanciare il tuo script, l'output è stato esattamente come lo hai segnalato, spostato di un'ora.

In particolare, la pagina di output era puntata al 14 p.v. ed il primo valore partiva dalle ore 1:00 ... i valori c'erano tutti, spostati di un'ora ed in più, c'era il primo valore del 15, che aveva ora 0:50.
Tale situazione mi ha pensare che la pagina rilevata sia completa ed elaborata per la data ricevuta ... che credo sia nessuna,

Ho concentrato i miei tentativi su mechanize ed è da stamattina che sto cercando di trovare il modo di inviare la data locale o l'ofset con UTC senza cavare un ragno dal buco, in particolare mi sono concentrato su cookies ed header, senza combinare nulla, non ho reperito documentazione in merito e da quella di mechanize non mi è riuscito di capire se e come si possa fare.

Nel caso riesca a combinare qualcosa, aggiornerò

Re: [Python] Stranezza nell'ora letta dal codice html

Inviato: domenica 13 gennaio 2019, 10:58
da vaeVictis
Ho risolto lasciando perdere mechanize e usando selenium.
È un simulatore di browseer. Faccio il login così c'è la mia time zone e poi mi scarico il csv senza fare il parsing. Mi sa anche che ho cambiato pure il sito :)

Grazie del supporto. Metto risolto ma se vuoi postare quanto riesci a fare sei il benvenuto e leggo con piacere.