Code python qui ne s'imprime pas
RésoluBonjour,
import re
import requests
from bs4 import BeautifulSoup
def get_all_pages():
urls = []
page_number = 1
for i in range(104):
i = f"https://www.barreaudenice.com/annuaire/avocats/?fwp_paged%7Bpage_number%7D="
page_number += 1
urls.append(i)
return urls
def parse_attorney(url):
r = requests.get("https://www.barreaudenice.com/annuaire/avocats/?fwp_paged=1")
soup = BeautifulSoup(r.content, "html.parser")
avocats = soup.find_all('div', class_='callout secondary annuaire-single')
for avocat in avocats:
try:
nom = avocat.find('h3').text.strip()
except AttributError as e:
nom = ""
adresse = avocat.find('span', class_= 'adresse').text.strip()
try:
adresse_finale = re.sub(r"\s+", " ", adresse)
except AttributError as e:
adresse_finale = ""
try:
telephone = avocat.find('span',class_='telephone').text.strip()
except AttributError as e:
telephone = ""
try:
email = avocat.find('span',class_='email').a.text.strip()
except AttributError as e:
email = ""
chemin = r"C:\Users\quent\PycharmProjects\pythonProject\scraping\ANNUAIRE-AVOCATS.txt"
with open(chemin, "a") as f:
f.write(f"{nom}\n")
f.write(f"{adresse - finale}\n")
f.write(f"{telephone}\n")
f.write(f"{email}\n")
def parse_all_attorneys():
pages = get_all_pages()
for page in pages:
parse_attorney(url=page)
print(f"On scrape {page}")
Il n'y a pas de message d'erreur lors du RUN, mais aucunes lignes de scrape n'apparait, et le fichier texte ne se crée pas dans mon repertoire ! Merci.
Windows / Firefox 126.0
“Impose ta chance, serre ton bonheur et va vers ton risque. A te regarder, ils s’habitueront.” René Char
20 réponses
Le script Python de scraping utilisant requests et BeautifulSoup vise à extraire des avocats/notaires et à écrire les résultats dans un fichier texte pour une collecte locale. Plusieurs éléments bloquent l’exécution et empêchent l’écriture du fichier: URL mal formées, erreurs de noms de variables et d’attributs, et appels de fonction qui ne déclenchent pas l’itération. Des réponses soulignent qu’il faut écrire les URL entre guillemets, corriger l’utilisation de variables (adresse_finale vs adresse - finale) et s’assurer que parse_all_attorneys est bien invoquée. En cas de persistance du problème, des ajustements recommandés incluent l’ajout d’un en-tête User-Agent, la vérification du statut HTTP et l’appel systématique de la boucle de scraping, afin d’obtenir un fichier texte opérationnel.
-
Contributeur
nonjour,
ne devrais-tu pas faire appel à ces fonctions?
-
Contributeur
Tu sais donc qu'il est nécessaire de faire appel à print() pour qu'il affiche quelque-chose.
Il en est de même pour toutes les fonctions. Où fais tu appel à la fonction parse_all_attorneys()?
-
A la ligne 18, je donne la définition de parse_all_attorneys
-
-
@yg_be
j'ai fais print(url) ou print(parse_attorney), cela ne change pas
-
-
Contributeur
il ne suffit pas de définir une fonction, il faut y faire appel
def dis_bonjour(): print("bonjour") dis_bonjour() -
J'ai fais déjà le test de ma requete du site, c'est un autre, mais c'est le même principe :
import requests from bs4 import BeautifulSoup r = requests.get(https://www.notaireetbreton.bzh/annuaire-notaire/) print(r.status_code)
j'ai une invlid systax en 5 et le site est bien présent quand on clique sur le lien :
r = requests.get(https://www.notaireetbreton.bzh/annuaire-notaire/)
-
-
-
@yg_be
Ok je sais que je fais des erreurs d'indentation et de syntaxe.
Le résulat une fois tout corrigé, c'est :
Process finished with exit code 0
Mais pas de scrap de fait, j'en conclus, et aussi d'après la personne qui a fait le tuto test, que le site empèche le scraping, même avec une adresse derrière un genre de VPN comme "speedify", cela ne change rien à l'affaire !
-
-
Tu te cherches des excuses, car si tu maitrisais un minimum Python, tu aurais pu comprendre et corriger le script :
import re import requests from bs4 import BeautifulSoup def get_all_pages(): urls = [] page_number = 1 for _ in range(10): url = f"https://www.barreaudenice.com/annuaire/avocats/?fwp_paged=%7Bpage_number%7D" page_number += 1 urls.append(url) return urls def parse_attorney(url): r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") avocats = soup.find_all('div', class_='callout secondary annuaire-single') for avocat in avocats: try: nom = avocat.find('h3').text.strip() except AttributeError as e: nom = "" try: adresse = avocat.find('span', class_= 'adresse').text.strip() adresse_finale = re.sub(r"\s+", " ", adresse) except AttributeError as e: adresse_finale = "" try: telephone = avocat.find('span',class_='telephone').text.strip() except AttributeError as e: telephone = "" try: email = avocat.find('span',class_='email').a.text.strip() except AttributeError as e: email = "" print("Nom :", nom) print("Adresse :", adresse_finale) print("Tel :", telephone) print("Email : ", email) def parse_all_attorneys(): pages = get_all_pages() for page in pages: print(f"\nOn scrape {page}\n") parse_attorney(page) parse_all_attorneys()Edit: ligne 11 les { } sont remplacées pas %7B et %7D !!!
On devrait lire :
{page_number}
-
-
@quentin2121
oui, c'est modifié, et je ne sais pas pourquoi, regarde mon Edit ci-dessus
-
@Diablo76
Bah merci beaucoup, je regarderais sur le site demain, là je suis KO ! Bonne soirée !
Tu en penses quoi des Headers ?
headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"} response = requests.get("https://httpbin.org/user-agent", headers=headers) response.json()C'est à rentrer après l'import requests ?
-
-
A ma ligne 28, j'ai des identations dans pycharm, je ne peux pas effacer les espaces :
Du coup ça me met des erreurs.
J'ai bien ouvert l'url du barreau de nice, à la page 2 et plus, je ne vois pas s'afficher les changements : %7B et %7D à la place de {page_number }, comment tu as pu le voir ? Je ne remets pas en doute tes compétences, mais je cherche à comprendre !
Du coup pour ce site qui m'intéresse plus : https://www.notaireetbreton.bzh/annuaire-notaire?page=1
On fait comment si je n'abuse pas trop ?
PS : tu fais des "print" à la fin, ce n'est pas mieux de créer un fichier .txt ?
-
Non c'est seulement sur le site de CCM que les accolades se transforment en charactères %7B et %7D.
Comment on fait ? on analyse le code source html et on modifie les paramètres de recherche en conséquence dans soup.find_all()
Pour moi ça n'apporte rien, mais tu peux créer le fichier texte si tu le désires
-
@Diablo76
import re import requests import requests session = requests.Session() session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}) response = session.get('http://httpbin.org/headers') # print response print(response.content) from bs4 import BeautifulSoup def get_all_pages(): urls = [] page_number = 1 for i in range(16): i = f"https://www.barreaudenice.com/annuaire/avocats/?fwp_paged%7Bpage_number%7D=" page_number += 1 urls.append(i)= RESTART: C:\Users\quent\AppData\Local\Programs\Python\Python311\ANNUAIRE_AVOCATS_NICE.py return urls def parse_attorney(url): r = requests.get("https://www.barreaudenice.com/annuaire/avocats/?fwp_paged=1") soup = BeautifulSoup(r.content, "html.parser") avocats = soup.find_all('div', class_='callout secondary annuaire-single') for avocat in avocats: try: nom = avocat.find('h3').text.strip() except AttributError as e: nom = "" adresse = avocat.find('span', class_= 'adresse').text.strip() try: adresse_finale = re.sub(r"\s+", " ", adresse) except AttributError as e: adresse_finale = "" try: telephone = avocat.find('span',class_='telephone').text.strip() except AttributError as e: telephone = "" try: email = avocat.find('span',class_='email').a.text.strip() except AttributError as e: email = "" chemin = r"C:\Users\quent\PycharmProjects\pythonProject\scraping\ANNUAIRE-AVOCATS.txt" with open(chemin, "a") as f: f.write(f"{nom}\n") f.write(f"{adresse - finale}\n") f.write(f"{telephone}\n") f.write(f"{email}\n") def parse_all_attorneys(): pages = get_all_pages() for page in pages: parse_attorney(url=page) print(f"On scrape {page}") input()Bonjour,
J'ai mis un code agent user après l'import requests pour que la requête python passe pour un navigateur, ne sois pas bloquée par le site et renvoie aucun scraping. J'ai ce résultat en RUN :
= RESTART: C:\Users\quent\AppData\Local\Programs\Python\Python311\ANNUAIRE_AVOCATS_NICE.py
b'{\n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Host": "httpbin.org", \n "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36", \n "X-Amzn-Trace-Id": "Root=1-66545fb9-59732b8b229052421bb364ad"\n }\n}\n'
C'est bon ou pas ? Bonne journée !
-
Modérateur@quentin2121
Il suffit de regarder le résultat de ta requête ?
import requests from bs4 import BeautifulSoup url = "https://www.barreaudenice.com/annuaire/avocats/?fwp_paged=1" r = requests.get(url) if r.status_code != 200: raise RuntimeError(f"Can't fetch {url}") soup = BeautifulSoup(r.text) print(soup.prettify()) -
@quentin2121
Pourquoi tu ne t'inspires pas de mon exemple ??
J'ai modifié la ligne 11 pour eviter la conversion des accolades, tu n'as plus qu'à intégrer la partie sauvegarde :
import re import requests from bs4 import BeautifulSoup def get_all_pages(): urls = [] page_number = 1 for _ in range(10): url = "https://www.barreaudenice.com/annuaire/avocats/?fwp_paged=" + str(page_number) page_number += 1 urls.append(url) return urls def parse_attorney(url): r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") avocats = soup.find_all('div', class_='callout secondary annuaire-single') for avocat in avocats: try: nom = avocat.find('h3').text.strip() except AttributeError as e: nom = "" try: adresse = avocat.find('span', class_= 'adresse').text.strip() adresse_finale = re.sub(r"\s+", " ", adresse) except AttributeError as e: adresse_finale = "" try: telephone = avocat.find('span',class_='telephone').text.strip() except AttributeError as e: telephone = "" try: email = avocat.find('span',class_='email').a.text.strip() except AttributeError as e: email = "" print("Nom :", nom) print("Adresse :", adresse_finale) print("Tel :", telephone) print("Email : ", email) def parse_all_attorneys(): pages = get_all_pages() for page in pages: print(f"\nOn scrape {page}\n") parse_attorney(page) parse_all_attorneys() -
@Diablo76
Parce que avec ton exemple, j'ai des erreurs. Je vais prendre des cours avec quelqu'un. Python et autres exercices à faire, comme le scraping. Merci de ton aide.
Ps: ton code est bon, enfin le mien aussi sur le site des notaires, mais ça me retourne aucuns scrapings. Je vais creuser cela.
-
-
Résultat :
C:\Users\quent\PycharmProjects\pythonProject\scraping\REQUETE.py:8: GuessedAtParserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.
The code that caused this warning is on line 8 of the file C:\Users\quent\PycharmProjects\pythonProject\scraping\REQUETE.py. To get rid of this warning, pass the additional argument 'features="html.parser"' to the BeautifulSoup constructor.
soup = BeautifulSoup(r.text)
NB : il y a tellement de ligne à copie coller dans pycharm que si cela te suffit pour voir si c'est ok ou pas, je ne les mets pas pour l'instant !
Si ok, je peux lancer mon code python de scraping à la suite de ça, à la suite de ce test requête ?
-
Modérateur
Bonjour, lis le message #20
soup = BeautifulSoup(r.content, "html.parser")
-
@mamiemando
En gros cela dit que mon analyseur beautifulsoup bloque sur quelque chose, ou demande un autre html en requête ?
Il faudrait un autre argument pour l'analyseur beautifulsoup, mais lequel ?
Je ne comprends quà moitié le sens de tout cela !
-
Modérateur@quentin2121
Cela dit que vue ta version de bs4, le second paramètre "html.parser" doit être précisé pour que le message d'avertissement ne s'affiche plus. Je dis ta version car chez moi (version 4.12.3), si j'omets ce paramètre, je n'ai pas de message d'avertissement. Mais comme le dit Diablo76 dans #25 ce n'est qu'un avertissement, donc si tu l'omets, ça n'empêche pas ton programme de fonctionner.
-
-
En Gros, ce message ne plante pas ton programme, c'est juste un avertissement :
/home/diablo76/Bureau/Test_Python/pythonTest/test1.py:18: GuessedAtParserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. The code that caused this warning is on line 18 of the file /home/diablo76/Bureau/Test_Python/pythonTest/test1.py. To get rid of this warning, pass the additional argument 'features="html.parser"' to the BeautifulSoup constructor. soup = BeautifulSoup(r.content) Nom : ABASSIT Florian Adresse : 31, avenue Jean Médecin 06000 Nice Tel : T . 04 23 40 02 02 Email : contact@abassit-avocats.com Nom : ABBATI Anaïs Adresse : 13, rue Alphonse Karr Le Louvre 06004 Tel : T . 04 97 03 11 50 Email : anais.abbati@alister-avocats.eu Nom : ABDALLAOUI Myriam Adresse : 11bis Bd Dubouchage 06000 Nice Tel : T . 06 04 65 39 13 Email : myriam-abdallaoui@hotmail.com Nom : ABDOULAYE MOUSSA Abdoul Wahab Adresse : 16, boulevard Raimbaldi 06000 Nice Tel : T . 06 51 83 90 86 Email : abdoul.abdoulayemoussa@gmail.com Nom : ABECASSIS Charles Adresse : 1, Place Magenta 06000 Nice Tel : T . 04 93 88 30 17 Email : ch.abk6@wanadoo.fr Nom : ABID Samih Adresse : 35, rue Gioffredo 06000 Nice Tel : T . 04 93 87 71 06 Email : contact@abid-avocats.com Nom : ABIER-ROUGERON Stéphanie Adresse : 22, rue Gounod 06000 Nice Tel : T . 06 30 12 89 76 Email : rougeronavocat@gmail.com Nom : ABOU EL HAJA Aziza Adresse : 1 Boulevard Général Delfino 06300 Nice Tel : T . 04 93 85 70 23 Email : aeh.avocat@gmail.com -
Je ne comprends pas ce que tu veux dire ou faire !!!.
Maintenant si tu veux utilier un user-agent pour simuler un navigateur lors des requêtes pourquoi pas.
Et ne me dis pas que mon script ne marche pas !!!!
Code :
import re import requests from bs4 import BeautifulSoup headers={"User-Agent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"} def get_all_pages(): urls = [] page_number = 1 for _ in range(10): url = "https://www.barreaudenice.com/annuaire/avocats/?fwp_paged=" + str(page_number) page_number += 1 urls.append(url) return urls def parse_attorney(url): r = requests.get(url, headers) soup = BeautifulSoup(r.content, "html.parser") avocats = soup.find_all('div', class_='callout secondary annuaire-single') for avocat in avocats: try: nom = avocat.find('h3').text.strip() except AttributeError as e: nom = "" try: adresse = avocat.find('span', class_= 'adresse').text.strip() adresse_finale = re.sub(r"\s+", " ", adresse) except AttributeError as e: adresse_finale = "" try: telephone = avocat.find('span',class_='telephone').text.strip() except AttributeError as e: telephone = "" try: email = avocat.find('span',class_='email').a.text.strip() except AttributeError as e: email = "" print("Nom :", nom) print("Adresse :", adresse_finale) print("Tel :", telephone) print("Email : ", email) def parse_all_attorneys(): pages = get_all_pages() for page in pages: print(f"\nOn scrape {page}\n") parse_attorney(page) parse_all_attorneys() -
le message 25, ce n'est pas un code Python....
la ligne 5 ne sert que si tu l'intègres dans la méthode get() ligne 17
-
import re import requests from bs4 import BeautifulSoup headers={"User-Agent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"} def get_all_pages(): urls = [] page_number = 1 for _ in range(100): url = f"https://www.notaireetbreton.bzh/annuaire-notaire?page=1" page_number += 1 urls.append(url) return urls def parse_notary(url): r = requests.get(url, headers) soup = BeautifulSoup(r.content, "html.parer" ) notaire = soup.find_all('div', class_='callout secondary annuaire-single') for notaire in notaires: try: nom = notaire.find('h3').text.strip() except AttributError as e: nom = "" adresse = notaire.find('span', class_= 'adresse').text.strip() try: adresse_finale = re.sub(r"\s+", " ", adresse) except AttributError as e: adresse_finale = "" try: telephone = notaire.find('span',class_='telephone').text.strip() except AttributError as e: telephone = "" try: email = notaire.find('span',class_='email').a.text.strip() except AttributError as e: email = "" chemin = r"C:\Users\quent\PycharmProjects\pythonProject\scraping\ANNUAIRE-NOTAIRE.txt" with open(chemin, "a") as f: f.write(f"{nom}\n") f.write(f"{adresse - finale}\n") f.write(f"{telephone}\n") f.write(f"{email}\n") def parse_all_notary(): pages = get_all_pages() for page in pages: print(f"\nOn scrape {page}\n") parse_notary(page) def parse_all_notary(): pages = get_all_pages() for page in pages: parse_notary(url=page) print(f"On scrape {page}")résultat : "Process finished with exit code 0"
Pas de scrape d'importer !
-
Heuu, tu éxagères !!!
yg_be t'a expliqué comment appeler une fonction en tout début de post !!!
A quel moment tu appelles ta fonction parse_all_notary() .
Supprime les lignes de 52 à 56 et marque seulement :
parse_all_notary()
De plus ton script va t'enregistrer 100 fois la page 1 car tu n'as rien compris aux variables !!!!!
-
@Diablo76
Mon cours python me fera apprendre les variables et le reste.
J'ai mis 100 en ligne 9, car il y a 100 notaires sur le site, et la ligne 11 "page_number += 1" renvoie vers les autres pages (10 notaires) x (10 pages).
-
-
A Diablo
J'ai supprimer les lignes 52 à 56, marquer "parse_all_notary()", toujours aucuns scraps et pourtant aucunes erreurs !
-
import re import requests from bs4 import BeautifulSoup headers={"User-Agent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"} def get_all_pages(): urls = [] page_number = 1 for _ in range(100): url = f"https://www.notaireetbreton.bzh/annuaire-notaire?paged1&page=1%3D%7Bpage_number%7D" page_number += 1 urls.append(url) return urls def parse_notary(url): r = requests.get(url, headers) soup = BeautifulSoup(r.content, "html.parer" ) notaire = soup.find_all('div', class_='callout secondary annuaire-single') for notaire in notaires: try: nom = notaire.find('h3').text.strip() except AttributError as e: nom = "" adresse = notaire.find('span', class_= 'adresse').text.strip() try: adresse_finale = re.sub(r"\s+", " ", adresse) except AttributError as e: adresse_finale = "" try: telephone = notaire.find('span',class_='telephone').text.strip() except AttributError as e: telephone = "" try: email = notaire.find('span',class_='email').a.text.strip() except AttributError as e: email = "" chemin = r"C:\Users\quent\PycharmProjects\pythonProject\scraping\ANNUAIRE-NOTAIRE.txt" with open(chemin, "a") as f: f.write(f"{nom}\n") f.write(f"{adresse - finale}\n") f.write(f"{telephone}\n") f.write(f"{email}\n") def parse_all_notary(): pages = get_all_pages() for page in pages: print(f"\nOn scrape {page}\n") parse_notary(page) def parse_all_notary(): parse_all_notary()Sur cette annuaire, la première page commence par la page 0. Ors en python je crois que le zéro est égale à faux, d'ou peut être le souci, ce n'est qu'une supposition !
-
Bonsoir, si tu comprenais un minimum ce que tu écris, tu aurais saisi que :
def parse_all_notary(): parse_all_notary()Est complètement saugrenu...
Tu devrais d'ailleurs te manger un RecursionError si tu avais appelé cette fonction parse_all_notary, faudrait vraiment suivre un tuto apprenant les bases de python.
Rien à voir avec un quelconque 0 en numéro de page.-
import re import requests from bs4 import BeautifulSoup def get_all_pages(): urls = [] page_number = 0 for _ in range(51): url = f"https://www.notaireetbreton.bzh/annuaire-notaire?page=1" page_number += 1 urls.append(url) return urls def parse_notary(url): r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") notaire = soup.find_all('div', class_='callout secondary annuaire-single') for notaire in notaires: try: nom = notaire.find('h3').text.strip() except AttributError as e: nom = "" adresse = notaire.find('span', class_= 'adresse').text.strip() try: adresse_finale = re.sub(r"\s+", " ", adresse) except AttributError as e: adresse_finale = "" try: telephone = notaire.find('span',class_='telephone').text.strip() except AttributError as e: telephone = "" try: email = notaire.find('span',class_='email').a.text.strip() except AttributError as e: email = "" chemin = r"C:\Users\quent\PycharmProjects\pythonProject\scraping\ANNUAIRE-NOTAIRE.txt" with open(chemin, "a") as f: f.write(f"{nom}\n") f.write(f"{adresse - finale}\n") f.write(f"{telephone}\n") f.write(f"{email}\n") def parse_all_notary(): pages = get_all_pages() for page in pages: print(f"\nOn scrape {page}\n") parse_notary(page) def parse_all_notary(): pages = get_all_pages() for page in pages: parse_notary(url=page) print(f"On scrape {page}")Même comme cela cela ne fonctionne pas, pas de scraps, aucunes erreurs de code !
-
Contributeur@quentin2121
Tes tentatives tentent à confirmer que tu devrais commencer par des exemples plus simples.
J'ai l'impression que tu ne maitrises pas les bases du langage.
-
@quentin2121
As-tu regardé le code source html de ton url ?
Tu aurais vu que rien ne correspond à ce que tu recherches dans ton code....
-
-
Rien qu'en modifiant ton code pour trouver rien que le permier élément, on se rend compte que rien n'est trouvé...
import re import requests from bs4 import BeautifulSoup from collections import namedtuple HEADERS = { 'User-Agent': ( 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) ' 'AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148' ) } Notary = namedtuple('Notary', ('name', 'adress', 'phone', 'email')) def parse_notary(url): r = requests.get(url, HEADERS) soup = BeautifulSoup(r.content, "html.parser" ) div = soup.find_all('div', class_='callout secondary annuaire-single') values = {} try: values['name'] = div.find('h3').text.strip() except AttributeError: values['name'] = 'Nom Introuvable...' try: values['adress'] = div.find('span', class_= 'adresse').text.strip() values['adress'] = re.sub(r"\s+", " ", values['adress']) except AttributeError: values['adress'] = 'Adresse introuvable...' try: values['phone'] = div.find('span',class_='telephone').text.strip() except AttributeError: values['phone'] = 'N° téléphone introuvable...' try: values['email'] = div.find('span',class_='email').a.text.strip() except AttributeError: values['email'] = 'Adresse courriel introuvable...' return Notary(**values) def parse_all_notaries(): notaries = [] for page in range(1): # print(f'Nanalyse de la page {page}') url = ( 'https://www.notaireetbreton.bzh/annuaire-notaire' 'paged1=&page=%d' % page ) notaries.append(parse_notary(url)) return notaries notaries = parse_all_notaries() for notary in notaries: print(notary)
Donc une analyse correcte du code html de la page à parser est à effectuer avant toute chose !-
Ce n'est pas comme ci, on ne le lui avait pas dit !!!!!
https://forums.commentcamarche.net/forum/affich-38050742-code-python-qui-ne-s-imprime-pas#p38050928
-
@Diablo76
En effet, désolé, je n'avais pas lu tout l'historique de ce topic ^_^
-
@rtm
Ne le sois pas, moi-même, je n'aurais pas pris la peine de lire tout l'historique ^_^
-
A rtm,
En ligne 9 de ton code, tu avais ceci : SyntaxError : chaîne littérale non terminée,
corrigée en ajoutant une barre oblique inverse à la fin des lignes 8, 9 et 10 :\
Sinon moi, je n'ai toujours pas de scrapings, avec un code sans erreurs ! J'ai essayé avec l'IDLE de base python, c'est idem.
Merci pour ton code !
-
-
Désolé, mais avec mon code sans le module "namedtuple", peut être que cela vient de là, mais je n'ai toujours aucuns scraps, je testerais ton code demain et te redirais.
import re import requests from bs4 import BeautifulSoup headers={"User-Agent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"} def get_all_pages(): urls = [] page_number = 0 for _ in range(51): url = f"https://www.notaireetbreton.bzh/annuaire-notaire?page=1" page_number += 1 urls.append(url) return urls def parse_notary(url): r = requests.get(url, headers) soup = BeautifulSoup(r.content, "html.parser") notaire = soup.find_all('div', class_='callout secondary annuaire-single') for notaire in notaires: try: nom = notaire.find('h3').text.strip() except AttributError as e: nom = "" adresse = notaire.find('span', class_= 'adresse').text.strip() try: adresse_finale = re.sub(r"\s+", " ", adresse) except AttributError as e: adresse_finale = "" try: telephone = notaire.find('span',class_='telephone').text.strip() except AttributError as e: telephone = "" try: email = notaire.find('span',class_='email').a.text.strip() except AttributError as e: email = "" chemin = r"C:\Users\quent\PycharmProjects\pythonProject\scraping\ANNUAIRE-NOTAIRE.txt" with open(chemin, "a") as f: f.write(f"{nom}\n") f.write(f"{adresse - finale}\n") f.write(f"{telephone}\n") f.write(f"{email}\n") def parse_all_notary(): pages = get_all_pages() for page in pages: print(f"\nOn scrape {page}\n") parse_notary(page) def parse_all_notary(): pages = get_all_pages() for page in pages: parse_notary(url=page) print(f"On scrape {page}") parse_all_notary()-
-
@yg_be
Je sais que ma ligne 58 est mal indentee. Et que mon copier coller à mis deux fois la dernière fonction. Toujours est-il que pas encore de scraping. A revoir...
-
@quentin2121
Encore une fois, on tourne en rond... Si tu n'as pas compris que l'indentation était importante en Python de plus :
Ligne 13, 14 -> erreur d'indentation.
ligne 19 -> "html.parser" et pas 'html.parer"
Ligne 20 notaire devrait être notaires (qui de toute façon ne retournera rien).
Ligne 25, 30, 34, 38 AttributError devrait être AttributeError.
Ligne 27 mal placée, elle devrait être dans le try du dessous.
-
@Diablo76
Merci pour les erreurs d'indentation, mais malgré ces corrections, toujours pas de scraps. Demain sera un nouveau jour.
Ps : pourquoi la ligne 20 ne retournera rien ?
-
@quentin2121
Évidemment, tu n'appelles aucune de tes fonctions, regardes dans les scripts que l'on t'a proposé et où est placé l'appel et son indentation.
Pourquoi la ligne 20 ne retournera rien ???
https://forums.commentcamarche.net/forum/affich-38050742-code-python-qui-ne-s-imprime-pas#p38050928
https://forums.commentcamarche.net/forum/affich-38050742-code-python-qui-ne-s-imprime-pas#p38052035
-
-
Bonjour,
C'est là le problème: tu recopie des bouts de code sans en comprendre
les tenants et les aboutissants
Les erreurs d'indentation et le fait que tu définis des fonctions mais que tu ne
les appelle pas montrent que tu n'a pas les bases de Python
Je pense que tu devrais te former d'abord au langage et aux bases
de la programmation en général :-)
-
Bonjour,
Je commence des cours demain ! Et ce n'est pas comme dans la chanson de JJ GOLDMAN... :)
Quand je dis, je commence, je continue la formation, on sait ce que c'est, c'est la pratique qui fait avancer et voir ses erreurs...
Pas la peine d'essayer de me décourager, même pas en rêve ! Heureusement que quand j'aide des personnes sur des sujets autres que le code python, je ne rabroue jamais quelqu'un comme vous le faites tous ici ! C'est une question d'état d'esprit, on n'as pas le même !
-
@quentin2121
On ne rabroue ni ne décourage personne, bien au contraire !
C'est juste un constat au vu de tes nombreux posts
Tu te sentiras plus à l'aise :-)
C'est vraiment gratifiant de trouver les solutions par soi-même ...
-
@quentin2121
Et pourquoi ne pas avoir commencé une auto formation dès le début ?
Il y a plein de tutoriels pour débutants sur internet, notamment sur developpez.com ou encore zestedesavoir.com
Je pense que beaucoup d'intervenants sur tes sujets en python t'ont rabâché à plusieurs reprises d'apprendre les rudiments du langage et cela pour ton bien.
Ces intervenants ont tout de même essayé de t'aider à réaliser ton script jusque complète saturation (* _ *) forcément c'est insoluble puisque tu en es encore au stade où tu es incapable de résoudre des erreurs d'indentations, tu arrives même à te gaufrer en faisant un simple copié-collé d'un script... C'est donc que tu n'as pas acquis les bases de la compréhension du langage et que tu veux réaliser des trucs trop complexes et hors d'atteinte au regard de ton expérience.Et ce n'est certainement pour te décourager ou te « rabrouer » ! Bien au contraire ! Puis à un moment donné, il faut savoir se remettre en cause s'il y a consensus.
J'espère tout même que tu arriveras à progresser en programmation, et que dans quelques années lorsque tu seras devenu plus chevronné et que tu reliras ce sujet : XD -
@rtm
Bonjour,
C'est précisément le problème puisque notre ami quentin a mis le retour de chariot avant les bugs en nous sollicitant à un grand nombre de reprises sur ce qu'il y avait lieu de penser de tel cours plus ou moins évolué sur tel langage de programmation qu'il envisageait d'entreprendre sans jamais le faire et s'adressant de toute manière à des personnes disposant des bases.
La recette de cuisine précédente et dont on n'entend plus parler consistait si j'ai bonne mémoire à écrire un jeu ex cathedra, ce qui est encore plus compliqué puisque cela passe, outre des connaissances en programmation, par d'autres en graphisme et un talent de création qui lui n'a pas forcément un caractère scolaire. -
@brucine
Bonjour,
J'ai mis la charrue avant les bœufs, je le reconnais. Quand je dis que j'ai fait une formation python de base, elle est vraie, mais il me manque la pratique, j'ai réussi à faire de petits programmes. Je me suis fait aider, j'en remercie les participants ici. C'est juste qu'ensuite, j'ai vu trop grand !
Tiens aujourd'hui, je prends un cours python via Zoom, je sais qu'il en faudra d'autres, et aussi visionner des tutos sur des forums ici précités ! Je vais mettre en stand by d'autres projets ! M'adonner à d'autres occupations, sans oublier de venir faire un tour sur le forum de CCM, pour la rubrique Windows au sens générale du terme, là où je peux aider un tant soit peu, et apprendre encore et toujours. Bonne journée Bruce !
-
-
find() renvoie 2 pages du site concerné, au lieu des 12 qu'il devrait :
https://www.notaireetbreton.bzh/annuaire-notaire
find_all() renvoie un msg d'erreur.
Pour la compréhension de ce que je fais, faut dire ça a mon professeur... :), je suis ce qu'il me dit de faire, s'il s'est planté là, je lui dirais. Lol.
-
Déjà, il faut employer les bons termes, ce n'est pas 2 pages sur 12 mais :
2 items ou rows sur 12 contenus dans une page.
Ici, on voit bien que chaque item appartient à une classe : node__content clearfix
On va donc récupérer chaque objet appartenant à cette classe :
import re import requests from bs4 import BeautifulSoup def get_html(url): r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") return soup def get_urls(html): notaire_items = html.find_all("div", {"class": "node__content clearfix"}) print(len(notaire_items)) def main(): url="https://www.notaireetbreton.bzh/annuaire-notaire?page=0" html = get_html(url) get_urls(html) main()Résultat : 12
Mais ce n'est pas fini, il faut maintenant récupérer dans chaque objet, les éléments qui nous intéressent, pour ça, il faut comprendre comment est fabriqué l'objet.
-
@Diablo76
Merci chef ! On dirait ici que le professeur est un prof pour les nuls... :)
-
@quentin2121
Non l'idée de ton coach d'aller chercher le lien (a) dans la balise h2 n'est pas mauvaise, sauf qu'il faut utiliser find_all(), find() ne retourne que le premier élément trouvé.
L'autre souci, c'est que comme h2 est une balise de titre couramment employée, on risque de se retrouver avec beaucoup d'éléments qui n'auront rien a voir avec notre recherche et qu'il faudra traiter.
-
@Diablo76
OK j'ai corrigé et ça fonctionne la ligne 13.
Pour le reste des données à extraire, j'ai vu que le nom c'est une balise "field_item", l'adresse aussi, le téléphone c'est une balise de class "call-herf", et enfin l'email a une classe en "use-ajax". Reste à rentrer la fonction
Def parse_notary(url):
La définir et l'appeller avec print(). Éléments par éléments. Puis créer le chemin pour éditer un fichier. txt et exécuter le tout. Encore bcp de travail à effectuer.
Je verrai la suite avec le prof prochainement.
-
-
Oui, c'est l'idée ;-)
je pense que tu peux clôturer cette discussion, et si besoin en créer une autre quand tu rencontreras des problèmes sur le script que tu vas travailler avec ton coach.

