W pierwszym przypadku, uzyskać previous sibling:
soup.select_one('#name > span.numbers').previous_sibling
W drugim przypadku, uzyskać next sibling:
soup.select_one('#name > #numbers').next_sibling
Zauważ, że zakładamy, że jest to zamierzone, że tu jesteś mieć wartość numbers
jako wartość id
, a znacznik to div
zamiast span
. Dlatego dostosowałem selektor CSS.
obejmować zarówno przypadki, można przejść do rodzica kolczyka i znaleźć węzeł tekstowy niepusty w trybie non-rekurencyjne:
parent = soup.select_one('#name > .numbers,#numbers').parent
print(parent.find(text=lambda text: text and text.strip(), recursive=False).strip())
Uwaga zmiana selektora - prosimy o dopasowanie do klasy numbers
id lub numbers
.
Chociaż mam wrażenie, że to uniwersalne rozwiązanie nie byłoby całkiem niezawodne, ponieważ na początek nie wiem, jakie mogą być twoje rzeczywiste wkłady.
Tak, zmiana id i div versus span była zamierzona. Dzięki za uwagę! Czy istnieje sposób, aby zacząć od rodzica, jak w ostatnim rozwiązaniu, a następnie wybrać bezpośrednio dla pierwszego dziecka w przypadku nr 1 lub dla drugiego dziecka w przypadku nr 2? Próbuję uniknąć użycia find lub findAll. – slaw
@slaw tak, oczywiście, możesz po prostu użyć listy 'contents':: tag.contents [0]' lub 'tag.contents [1]'. Lub przejdź przez generator 'tag.children'. – alecxe