Nel primo caso, ottenere il previous sibling:
soup.select_one('#name > span.numbers').previous_sibling
Nel secondo caso, ottenere il next sibling:
soup.select_one('#name > #numbers').next_sibling
Nota che presumo che sia intenzionale che qui si avere il valore numbers
come valore id
e il tag è div
anziché span
. Quindi, ho regolato il selettore CSS.
Per coprire entrambi i casi, si può andare al genitore del tag e trovare il nodo di testo non vuoto in una modalità non-ricorsivo:
parent = soup.select_one('#name > .numbers,#numbers').parent
print(parent.find(text=lambda text: text and text.strip(), recursive=False).strip())
nota il cambiamento nel selettore - stiamo chiedendo di abbinare l'id numbers
o la classe numbers
.
Tuttavia, ho la sensazione che questa soluzione universale non sarebbe abbastanza affidabile in quanto, per cominciare, non so quali potrebbero essere i vostri reali input.
Sì, il cambio dell'ID e div contro lo span era intenzionale. Grazie per aver notato! C'è un modo per iniziare con il genitore come nella tua ultima soluzione e quindi selezionare direttamente per il primo figlio nel caso # 1 o per il secondo figlio nel caso # 2? Sto cercando di evitare di usare find o findAll. – slaw
@slaw sì, certo, puoi semplicemente usare la lista 'contents':' tag.contents [0] 'o' tag.contents [1] '. Oppure, passa attraverso il generatore di 'tag.children'. – alecxe