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
Répondre
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.
Bonne réponse détaillée. –
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
tout d'abord vous soupe écrasant. –