Se tutti i field sono fatti in un modo unico allora puoi parsare con una regex, altrimenti puoi avere un valore che può essere assegnato a diversi field e non ci puoi fare nulla, credo
Читать полностью…
no ma quella ok, interessa sapere se puoi avere un field (della riga) mancante e il successivo o uno dei successivi presenti
Читать полностью…
Allora con il generatore dovrebbe uscire molto carino perché puoi direttamente chiamare next sul generatore e in automatico se non c'è niente ti dà None così non é solo molto più efficiente perchè non allochi e non fai operazioni extra ma ottieni anche l'informazione di quali field sono presenti e quali no, quelli che non ci sono saranno None perchè é quello che ritorna se chiami next su un generatore vuoto
Читать полностью…
Per capirci, mi ha dato questo:
from bs4 import BeautifulSoupЧитать полностью…
from bs4.element import Tag, NavigableString
html = """
<td>18:00<br><span style="font-size:10px">28 days</span></td>
<td> TEXT1 <br><span style="font-size:10px">TEXT2</span></td>
"""
soup = BeautifulSoup(html, "html.parser")
td_list = soup.find_all("td")
def parse_td(td):
# testi dentro gli <span>
span_texts = [s.get_text(strip=True) for s in td.find_all("span")]
# testi fuori dallo span: scorri i contenuti figli e prendi solo le NavigableString
outer_parts = []
for node in td.contents:
# se è una stringa (NavigableString) -> strip e aggiungi
if isinstance(node, NavigableString):
text = node.strip()
if text:
outer_parts.append(text)
# se è un Tag diverso dallo span (es. <b>, <i>, ecc.), estrai il suo testo
elif isinstance(node, Tag) and node.name != "span":
text = node.get_text(" ", strip=True)
if text:
outer_parts.append(text)
outer_text = " ".join(outer_parts) # unisci parti separate da spazi
return outer_text, span_texts
for td in td_list:
outer, spans = parse_td(td)
print("Outer:", outer)
print("Spans:", spans)
print("---")
Ci darò un occhio appena torno a casa, ho provato a mandarlo anche a gpt ma non ho ricevuto risposte utili
Читать полностью…
Aggiungici poi che la data è un normale tr posto sulla tabella e scorrendola si incontrano date di giorni precedenti
Читать полностью…
Esatto, ma stavo cercando, che magari c'era un metodo che era più adatto, perchè comunque lui per fare quella roba sta già iterando sulle stringhe singole, quindi il metodo prende già la lista di strighe(che ti serve a te) le concatena e te le dà, poi tu devi sconcatenarle per riottenere qualcosa che aveva già prima, non ha senso computazione totalmente inutile
Читать полностью…
no certo ma a te servono i singoli valori giusto? non ti serve la sola stringa intera(?)
Читать полностью…
spe, td.get_text(" ", True) é una stringa con gli spazi come separatore e rappresenta una riga?
quindi é nel formato:
"{orario} {titolo} {desc} ..."?
E tu vuoi evitare di prendere orario nel loop di td perchè lo conosci già prima che inizi quel loop?
Che sono campi con qualcosa a discapito di " "
Читать полностью…
Al momento sto provando con un
td.get_text(" ", True)
for td in tr.find_all("td")
Quello che vedo io è solo un pattern che ricorda un orario/durata
Читать полностью…
Basta uno strip, ma comunque la cosa migliore é evitare direttamente questo check nel loop (che dovrà fare per ogni elemento, ma gli serve solo per il primo elemento) se sai che é il primo con uno slice lo skippi
Читать полностью…
Se la prima cella di ogni riga contiene sempre l'orario si esclude a priori facilmente con una regex
Читать полностью…
<td class="123"></td>
<td>...</td>
Oddio ci sono casi così, sì
ah però io ho assunto che sono sempre in ordine, e se ne manca uno poi gli altri che seguono non ci sono, ma sarebbe un problema che avresti anche con get_text.
Puoi avere una cosa come:
orario titolo desc
Quindi quando vai a vedere i child ottieni:
orario desc
?
Esatto, ora non ricordo preciso se 8 o 7 ma dubito cambi di troppo la cosa
Читать полностью…
E hai anche una length di questa lista che varia da 4 a 8 giusto?
Читать полностью…
Se usassi td.strings ? da doc dice che ritorna solo NavigableString (che mi pare é quello che ti interessa, e CData e le yelda quindi dovrebbe essere un generatore, puoi usare direttamente questo, filtrando con isistanceof
Читать полностью…
Eh sì, purtroppo sta tabella è fatta anche male senza classi o altro e ho anche il fastidio che non tutti sono span ma diventano <a> (a caso) quindi non posso filtrare per quello
Читать полностью…
Neanche quello è un problema, mi basta usare split con lo spazio in quel caso
Читать полностью…
Però fare pulizia di quella stringa non penso sia troppo rallentante
Читать полностью…
con fissi intendi che é uguale per ogni td in tr.find_all("td")?
Читать полностью…
Tecnicamente dovrebbe essere
Orario | Titolo | Desc | ... |
Ogni riga ha generalmente 8 campi anche se altri sono 4, quelli fissi sono sempre i primi 3 di cui il primo è inutile dato che coincide con la partenza del cron
oddio, non é un po' esagerato? deve solo matchare esattamente "18:00", la cosa migliore sarebbe che prendere lo slice dell'iterabile e saltare il primo elemento, che é quello che contiene il 18:00
Читать полностью…
mh credo che farò così, in effetti non ci avevo pensato
Читать полностью…