2012-03-30 17 views
5

Il mio primo post qui, sto cercando di trovare tutti i tag in questo specifico html e non posso farli fuori, questo è il codice:pitone BeautifulSoup ricerca di un tag

from bs4 import BeautifulSoup 
from urllib import urlopen 

url = "http://www.jutarnji.hr" 
html_doc = urlopen(url).read() 
soup = BeautifulSoup(html_doc) 
soup.prettify() 
soup.find_all("a", {"class":"black"}) 

funzione ritorna find [ ], ma vedo che ci sono tag con classe: "nero" nell'html, mi manca qualcosa?

Grazie, Vedran

+0

Quale versione di Python/versione di libreria/OS stai usando? – fabrizioM

risposta

1

Sembra funzionare per me, quindi direi che il problema è con il documento HTML.

ho cercato di eseguire il seguente:

from bs4 import BeautifulSoup 

html_doc = """<html> 
<body> 
    <a class="black"> 
    <b> 
    text1 
    </b> 
    <c> 
    text2 
    </c> 
    </a> 
    <a class="micio"> 
    </a> 
    <a class="black"> 
    </a> 
</body> 
</html>""" 
soup = BeautifulSoup(html_doc) 
soup.prettify() 
print(soup.find_all("a", {"class":"black"})) 

E come output che ho ottenuto:

[<a class="black"> 
<b> 
    text1 
    </b> 
<c> 
    text2 
    </c> 
</a>, <a class="black"> 
</a>] 

Edit: Come @Puneet ha sottolineato, il problema potrebbe essere la mancanza di uno spazio bianco tra gli attributi nel file html che stai recuperando.

ho provato ad esempio per modificare l'esempio precedente a qualcosa di simile:

html_doc = """<html> 
<body> 
    <aclass="black"> 

# etc.. as before 

e ho avuto una lista vuota come risultato: [].

1

Il problema qui è che i tag di classe del sito Web non sono separati dalla fine del valore dell'attributo href con uno spazio. BeautifulSoup non sembra gestirlo molto bene. Un caso di test riproducibile è il seguente

>>> BeautifulSoup.BeautifulSoup('<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/" class="black">').prettify() 
'<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/" class="black">\n</a>' 
>>> BeautifulSoup.BeautifulSoup('<a href="http://www.jutarnji.hr/crkva-se-ogradila-od--cjenika--don-mikica--osim-krizme--sve-druge-financijske-obveze-su-neprihvatljive/1018314/"class="black">').prettify() 
'' 
0

cuciture che usando lxml risolve il problema:

from bs4 import BeautifulSoup 
import lxml 
from urllib import urlopen 

url = "http://www.jutarnji.hr" 
html_doc = urlopen(url).read() 
soup = BeautifulSoup(html_doc, "lxml") 
soup.prettify() 

soup.find_all("a", {"class":"black"}) 
1

Ho anche avuto lo stesso problema.

Prova

soup.findAll("a",{"class":"black"}) 

invece di

soup.find_all("a",{"class":"black"}) 

soup.findAll() funziona bene per me.

+0

Funziona anche con altri elementi come: soup.findAll ("label", {"per": "Form_CompanyName"}) –

Problemi correlati