python beautifulsoup - Solo estraendo testo da questo elemento, non dai suoi figli




and from (5)

che dire di .find(text=True) ?

>>> BeautifulSoup.BeautifulSOAP('<html>yes<b>no</b></html>').find(text=True)
u'yes'
>>> BeautifulSoup.BeautifulSOAP('<html><b>no</b>yes</html>').find(text=True)
u'no'

MODIFICARE:

Penso di aver capito cosa vuoi ora. Prova questo:

>>> BeautifulSoup.BeautifulSOAP('<html><b>no</b>yes</html>').html.find(text=True, recursive=False)
u'yes'
>>> BeautifulSoup.BeautifulSOAP('<html>yes<b>no</b></html>').html.find(text=True, recursive=False)
u'yes'

Voglio estrarre solo il testo dall'elemento più in alto della mia zuppa; tuttavia soup.text fornisce anche il testo di tutti gli elementi figli:

io ho

import BeautifulSoup
soup=BeautifulSoup.BeautifulSoup('<html>yes<b>no</b></html>')
print soup.text

L'output di questo è yesno . Voglio semplicemente "sì".

Qual è il modo migliore per raggiungere questo obiettivo?

Modifica : desidero anche che venga emesso yes durante l'analisi di ' <html><b>no</b>yes</html> '.


Potresti usare i contents

>>> print soup.html.contents[0]
yes

o per ottenere tutti i testi in html, usa findAll (text = True, recursive = False)

>>> soup = BeautifulSoup.BeautifulSOAP('<html>x<b>no</b>yes</html>')
>>> soup.html.findAll(text=True, recursive=False) 
[u'x', u'yes']

sopra uniti per formare una singola stringa

>>> ''.join(soup.html.findAll(text=True, recursive=False)) 
u'xyes'

Questo funziona per me in bs4:

import bs4
node = bs4.BeautifulSoup('<html><div>A<span>B</span>C</div></html>').find('div')
print "".join([t for t in node.contents if type(t)==bs4.element.NavigableString])

produzione:

AC

Potresti voler esaminare il modulo del soupparser di soupparser , che ha il supporto per XPath:

>>> from lxml.html.soupparser import fromstring
>>> s1 = '<html>yes<b>no</b></html>'
>>> s2 = '<html><b>no</b>yes</html>'
>>> soup1 = fromstring(s1)
>>> soup2 = fromstring(s2)
>>> soup1.xpath("text()")
['yes']
>>> soup2.xpath("text()")
['yes']

L' istruzione del rimuove un elemento:

del d[key]

Tuttavia, questo muta il dizionario esistente in modo che il contenuto del dizionario cambi per chiunque abbia un riferimento alla stessa istanza. Per restituire un nuovo dizionario, creare una copia del dizionario:

def removekey(d, key):
    r = dict(d)
    del r[key]
    return r

Il costruttore dict() esegue una copia superficiale . Per fare una copia profonda, vedi il modulo di copy .

Si noti che fare una copia per ogni dict del / assignment / ecc. significa che stai passando dal tempo costante al tempo lineare e anche usando lo spazio lineare. Per i piccoli dadi, questo non è un problema. Ma se stai pianificando di fare molte copie di dict di grandi dimensioni, probabilmente vuoi una diversa struttura di dati, come un HAMT (come descritto in questa risposta ).





python parsing text beautifulsoup