2016-06-17 47 views
6

Esempio HTMLOttenere testo con BeautifulSoup CSS Selector

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

posso ottenere i numeri con qualcosa di simile:

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

Come faccio ad avere il testo ABC utilizzando BeautifulSoup e la funzione select?

E in questo caso?

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

risposta

6

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.

+0

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

+0

@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