2016-06-17 25 views
6

Przykład HTMLPobierz tekst z BeautifulSoup CSS Selector

<h2 id="name"> 
    ABC 
    <span class="numbers">123</span> 
    <span class="lower">abc</span> 
</h2> 

mogę uzyskać numery z czymś takim:

soup.select('#name > span.numbers')[0].text 

Jak mogę uzyskać tekst ABC korzystając BeautifulSoup i funkcję select?

Co z tym przypadkiem?

<div id="name"> 
    <div id="numbers">123</div> 
    ABC 
</div> 

Odpowiedz

6

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.

+0

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

+0

@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