2012-07-04 11 views
9

Utilizzando il modulo Beautiful Soup, come posso ottenere i dati di un tag div il cui nome classe è feeditemcontent cxfeeditemcontent? È:Ottieni il nome e il contenuto della classe utilizzando Beautiful Soup

soup.class['feeditemcontent cxfeeditemcontent'] 

o:

soup.find_all('class') 

Questa è la sorgente HTML:

<div class="feeditemcontent cxfeeditemcontent"> 
    <div class="feeditembodyandfooter"> 
     <div class="feeditembody"> 
     <span>The actual data is some where here</span> 
     </div> 
    </div> 
</div> 

e questo è il codice Python:

from BeautifulSoup import BeautifulSoup 
html_doc = open('home.jsp.html', 'r') 

soup = BeautifulSoup(html_doc) 
class="feeditemcontent cxfeeditemcontent" 

risposta

8

Prova questo, forse è troppo per questa cosa semplice, ma funziona:

def match_class(target): 
    target = target.split() 
    def do_match(tag): 
     try: 
      classes = dict(tag.attrs)["class"] 
     except KeyError: 
      classes = "" 
     classes = classes.split() 
     return all(c in classes for c in target) 
    return do_match 

html = """<div class="feeditemcontent cxfeeditemcontent"> 
<div class="feeditembodyandfooter"> 
<div class="feeditembody"> 
<span>The actual data is some where here</span> 
</div> 
</div> 
</div>""" 

from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(html) 

matches = soup.findAll(match_class("feeditemcontent cxfeeditemcontent")) 
for m in matches: 
    print m 
    print "-"*10 

matches = soup.findAll(match_class("feeditembody")) 
for m in matches: 
    print m 
    print "-"*10 
+4

'classes = dict (tag.attrs) .get ('class', '')' è molto più corto del blocco 'try'. Except' e la sua funzionalità è la stessa. –

+0

@DoronCohen è 'dict()' necessario? Sembra funzionare senza. – Mark

+0

@Mark Ricevo un'eccezione senza 'dict()' perché è un elenco 'TypeError: gli indici di lista devono essere interi, non str'. Inoltre, questa risposta presuppone Beautiful Soup 3 (potrebbe essere il motivo per cui stai vedendo risultati diversi), probabilmente dovresti usare la versione 4 e usare l'altra risposta. – jadkik94

1
soup.find("div", {"class" : "feeditemcontent cxfeeditemcontent"}) 
+0

o soup.findAll se ne volete più di uno (usate gli stessi argomenti) –

+0

Non vorrei davvero usare quel codice per ovvi motivi. Controlla la mia risposta. C'è un rapporto bug correlato. – SuperSaiyan

+0

Puoi spiegare perché hai downvoted la mia soluzione? Funziona perfettamente. –

0

Controllare questo bug report: https://bugs.launchpad.net/beautifulsoup/+bug/410304

Come si può vedere, bella zuppa può non capire veramente class="a b" come due classi a e b.

Tuttavia, come appare nel primo commento, una semplice regexp dovrebbe essere sufficiente. Nel tuo caso:

soup = BeautifulSoup(html_doc) 
for x in soup.findAll("div",{"class":re.compile(r"\bfeeditemcontent\b")}): 
    print "result: ",x 

Nota: ciò è stato corretto nella recente beta. Non ho esaminato i documenti delle versioni recenti, potrebbe essere che potresti farlo. O se vuoi farlo funzionare usando la versione precedente, potresti usare quanto sopra.

17

Beautiful Soup 4 tratta il valore dell'attributo "classe" come lista piuttosto che una stringa, che significa la soluzione di jadkik94 può essere semplificata:

from bs4 import BeautifulSoup             

def match_class(target):               
    def do_match(tag):               
     classes = tag.get('class', [])           
     return all(c in classes for c in target)         
    return do_match                

soup = BeautifulSoup(html)              
print soup.find_all(match_class(["feeditemcontent", "cxfeeditemcontent"])) 
3
from BeautifulSoup import BeautifulSoup 
f = open('a.htm') 
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'id':'abc def'}) 
print list 
4

soup.findAll("div", class_="feeditemcontent cxfeeditemcontent")

Quindi, se voglio ge t tutti i tag div di classe intestazione <div class="header"> da stackoverflow.com, un esempio con BeautifulSoup sarebbe qualcosa di simile:

from bs4 import BeautifulSoup as bs 
import requests 

url = "http://stackoverflow.com/" 
html = requests.get(url).text 
soup = bs(html) 

tags = soup.findAll("div", class_="header") 

E 'già in BS4 documentation.

Problemi correlati