2015-06-06 5 views
5

Sto cercando di rasentare nature.com per eseguire alcune analisi sugli articoli di giornale. Quando eseguo il seguente:Beautifulsoup Can not Find All

import requests 
from bs4 import BeautifulSoup 
import re 

query = "http://www.nature.com/search?journal=nature&order=date_desc" 

for page in range (1, 10): 
    req = requests.get(query + "&page=" + str(page)) 
    soup = BeautifulSoup(req.text) 
    cards = soup.findAll("li", "mb20 card cleared") 
    matches = re.findall('mb20 card cleared', req.text) 
    print(len(cards), len(matches)) 

mi aspetto BeautifulSoup per stampare "25" (il numero di risultati di ricerca) per 10 volte (una per ogni pagina), ma non è così. Invece, esso stampa:

14, 25 
12, 25 
25, 25 
15, 25 
15, 25 
17, 25 
17, 25 
15, 25 
14, 25 

Guardando il sorgente html mostra che ci dovrebbe essere 25 risultati restituiti per pagina, ma BeautifulSoup sembra essere confuso qui e non posso capire perché.

Update 1 Nel caso in cui è importante, sto correndo su Mac OSX Mavericks usando Anaconda Python 2.7.10 e BS4 versione 4.3.1

Update 2 ho aggiunto una regex per dimostrare che req. il testo contiene effettivamente quello che sto cercando ma beautifulsoup non lo trova

Aggiornamento 3 Quando eseguo questo semplice script più volte, a volte ottengo un "Errore di segmentazione: 11". Non so perché

+3

Funziona per me non trovi il '()' 'per print' se il pitone è 3.x – styvane

+0

@ Michael: Quando si esegue questo codice, stampa "25" 10 volte di fila ?? Ottengo 14,12,25,15,15,17,17,15,14. – slaw

+0

sì '25' 10 volte. avviare un nuovo interprete Python ed eseguire nuovamente il codice per vedere – styvane

risposta

1

Ci sono differences tra il parsers used by BeautifulSoup under-the-hood.

Se non si specifica un parser in modo esplicito, BeautifulSoup sarebbe choose the one based on rank:

Se non si specifica nulla, si otterrà il miglior parser HTML che è installato. Beautiful Soup classifica il parser di lxml come il migliore, quindi html5lib's, quindi il parser incorporato di Python.

specificare il parser in modo esplicito:

soup = BeautifulSoup(data, 'html5lib') 
soup = BeautifulSoup(data, 'html.parser') 
soup = BeautifulSoup(data, 'lxml')