2017-10-03 2 views
0

Je travaille pour un projet et j'aimerais récupérer quelques informations pour créer une base de données à partir de nombreux sites Web. J'ai appris un peu de Python et comment utiliser la bibliothèque BeautifulSoup et j'ai essayé ci-dessous. Lorsque j'essaie de ne prendre que du texte en utilisant un attribut, il me dit que ce n'est pas possible. De l'aide ?Gratter le texte d'une balise en utilisant beautifulsoup

+0

tout d'abord vous soupe écrasant. –

Répondre

2

Vous pouvez simplifier votre code un peu en utilisant le requests library, c'est plus haut niveau que urllib. Vous pouvez également utiliser des sélecteurs CSS pour extraire des tags de la source de la page, ils sont un peu plus propres et généralement plus robustes à utiliser. BeautifulSoup docs contain plenty of useful into on them.

import requests 
from bs4 import BeautifulSoup 

response = requests.get('http://paris.quel-institut-beaute.com') 
soup = BeautifulSoup(response.content, 'lxml') 

# soup.select() will return a list of all tags with class 'ic' 
stores = soup.select('.ic') 

Si vous essayez d'appeler get_text() ou text sur la liste, il ne fonctionnera pas. Au lieu de cela, vous devez parcourir les éléments de la liste pour obtenir du texte.

for tag in stores: 
    print(tag.get_text(strip=True)) 

Si vous allez faire de multiples demandes du même script, use a Session object from the Requests library. Il utilisera la même connexion TCP, améliorant ainsi les performances.

Cela va au-delà de la portée de la question, mais si vous voulez sérialiser les informations de magasin, vous pouvez le faire comme ceci:

import json 
from collections import OrderedDict 

import requests 
from bs4 import BeautifulSoup 

response = requests.get('http://paris.quel-institut-beaute.com') 
soup = BeautifulSoup(response.content, 'lxml') 
stores = soup.select('.ic') 

store_details = OrderedDict() 
for store in stores: 
    store_name = store.select_one('h3').get_text() 
    store_address = store.select_one('.street-address').get_text() 
    postal_code = store.select_one('.postal-code').get_text() 
    locality = store.select_one('.locality').get_text() 

    store_details[store_name] = { 
     'store_address': store_address, 
     'postal_code': postal_code, 
     'locality': locality 
    } 

shop_details_json = json.dumps(store_details, indent=4, separators=(',', ':')) 

Vous pouvez imprimer shop_details_json pour voir les informations stockées sous forme de une série de dictionnaires, en utilisant le nom du magasin comme clé et l'adresse comme valeur.

+1

Bonne réponse détaillée. –

0

Vous obtenez un retour iterator, donc vous devez afficher chacun dans une boucle:

import requests 
from bs4 import BeautifulSoup 

response = requests.get('http://paris.quel-institut-beaute.com') 
soup = BeautifulSoup(response.content, 'lxml') 

for div in soup.find_all("div", class_="ic"): 
    print(div.get_text(strip=True)) 

vous donner:

En savoir plusDelicates Attentions425 avis8 Passage Du Guesclin75015Paris 
En savoir plusInstitut Du Regard53 avis30 Rue de Lagny75020Paris 
En savoir plusEtoile Nails420 avis27 Av. Ledru Rollin75012Paris 
En savoir plusInstitut Marie Pauline485 avis9 Boulevard Arago75013Paris 
En savoir plusInstitut Pyrene524 avis2 Rue Greffulhe75008Paris 
En savoir plusNymphee12 avis28 Rue Glaciere75013Paris 
En savoir plusGrain De Beaute430 avis1 Rue Petion75011Paris 
En savoir plusOumy Esthetique23 avis1 Rue Tanneries75013Paris 
En savoir plusEric Nicolas Louis11 avis50 Boulevard Arago75013Paris 
En savoir plusBiozen519 avis26 Boulevard de Magenta75010Paris 
En savoir plusBulle De Soins411 avis149 Rue Raymond Losserand75014Paris 
En savoir plusCryominceur0aucun avis19 Rue Nicolo75116Paris 
En savoir plusAU TEMPS D'UN SOIN57 avis55 rue de Turbigo75003Paris 
En savoir plusLe Boudoir Parisien41 avis251, avenue Daumesnil75012Paris 
En savoir plusAlex'sthetik0aucun avis49, rue St Placide75006Paris