Code python qui ne s'imprime pas
RésoluDiablo76 Messages postés 204 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 30 octobre 2024 - 1 juin 2024 à 18:13
- Code python qui ne s'imprime pas
- Citizen code python - Accueil - Outils
- Code asci - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
20 réponses
Modifié le 26 mai 2024 à 15:17
nonjour,
ne devrais-tu pas faire appel à ces fonctions?
26 mai 2024 à 16:20
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()?
26 mai 2024 à 16:28
A la ligne 18, je donne la définition de parse_all_attorneys
26 mai 2024 à 17:37
En effet, cette fonction est définie, et elle n'est jamais appelée.
26 mai 2024 à 17:54
j'ai fais print(url) ou print(parse_attorney), cela ne change pas
26 mai 2024 à 18:03
il ne suffit pas de définir une fonction, il faut y faire appel
def dis_bonjour(): print("bonjour") dis_bonjour()
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionModifié le 26 mai 2024 à 18:38
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/)
26 mai 2024 à 18:52
bonjour
si tu n'écris pas l'URL entre quotes.. normal que ça plante...
ps: on t'a déjà dit de prendre des cours depuis le début car tu ne fais que copier coller bêtement des choses sans comprendre comment ça fonctionne...
26 mai 2024 à 19:14
regarde la ligne 19 du code que tu as partagé au départ de cette discussion
26 mai 2024 à 19:35
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 !
Modifié le 26 mai 2024 à 20:55
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}
26 mai 2024 à 20:50
tu as vu cela sur le site web :
url = f"https://www.barreaudenice.com/annuaire/avocats/?fwp_paged=%7Bpage_number%7D"
Sinon j'etais parti pour changer de agents_users après l'import de request ! Pour passer pour un navigateur.
26 mai 2024 à 20:58
oui, c'est modifié, et je ne sais pas pourquoi, regarde mon Edit ci-dessus
Modifié le 26 mai 2024 à 21:11
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 ?
26 mai 2024 à 23:50
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 ?
27 mai 2024 à 00:37
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
27 mai 2024 à 12:33
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 !
27 mai 2024 à 13:02
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())
Modifié le 27 mai 2024 à 18:42
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()
Modifié le 27 mai 2024 à 19:27
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.
28 mai 2024 à 11:25
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 ?
28 mai 2024 à 13:59
Bonjour, lis le message #20
soup = BeautifulSoup(r.content, "html.parser")
Modifié le 28 mai 2024 à 15:04
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 !
Modifié le 29 mai 2024 à 12:17
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.
28 mai 2024 à 17:36
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
28 mai 2024 à 19:00
Merci. Tu rentres les lignes 1, 3 et 5 de ton code ci-dessus, avec le chemin du code python scraping par exemple, RUN, le scraping s'effectue ?
OK tu recopies le résultat de la requête, tu nommes le code python comme tu veux ? Je vais tester.
Modifié le 28 mai 2024 à 19:41
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()
28 mai 2024 à 19:54
Je parlais de ton code python du message 25. Mais ta ligne 5 du code python en message 27, est encore plus simple pour simuler un navigateur. Un grand merci à toi, bonne soirée.
Modifié le 28 mai 2024 à 20:17
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
28 mai 2024 à 20:40
OK, merci pour cette précision.
29 mai 2024 à 12:21
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 !
Modifié le 29 mai 2024 à 13:26
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 !!!!!
29 mai 2024 à 14:15
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).
Modifié le 29 mai 2024 à 15:38
A Diablo
J'ai supprimer les lignes 52 à 56, marquer "parse_all_notary()", toujours aucuns scraps et pourtant aucunes erreurs !
29 mai 2024 à 16:52
montre ton code modifié
Modifié le 29 mai 2024 à 18:44
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.
29 mai 2024 à 18:54
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 !
29 mai 2024 à 19:15
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.
Modifié le 29 mai 2024 à 19:20
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 !
29 mai 2024 à 19:33
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
29 mai 2024 à 20:34
En effet, désolé, je n'avais pas lu tout l'historique de ce topic ^_^
30 mai 2024 à 00:19
Ne le sois pas, moi-même, je n'aurais pas pris la peine de lire tout l'historique ^_^
Modifié le 30 mai 2024 à 09:24
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 !
Modifié le 29 mai 2024 à 22:22
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()
29 mai 2024 à 22:34
Tu as mis l'appel à la fonction à l'intérieur de la fonction!
Connais-tu comment fonctionne l'indentation en Python?
29 mai 2024 à 23:00
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...
Modifié le 29 mai 2024 à 23:54
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.
Modifié le 30 mai 2024 à 00:19
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 ?
Modifié le 30 mai 2024 à 10:24
Salut, aucun scraping, aucun scraping...
As-tu visualisé le html ?
Il n'y a pas d'informations concernant téléphone et email dans la liste des notaires, donc c'est déjà à virer de la recherche sur chaque page, mais ces infos (tél., courriel, site web) sont stipulés sur la page individuelle de chaque notaire, comme par ex. https://www.notaireetbreton.bzh/annuaire-notaire/antoine-teitgen-et-matthieu-gentils donc à voir plus tard pour le faire.
Maintenant si tu avais les bases en python ou même en programmation avec un autre langage, tu n'aurais aucune difficulté à coder un bout de code d'une 60aine de lignes afin de réaliser ton truc.
import re import requests from bs4 import BeautifulSoup import csv import time import random 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_notaries(url): notaries = [] response = requests.get(url, HEADERS) html = BeautifulSoup(response.content, 'html.parser') # IL EST TOUJOURS PRÉFÉRABLE DE TRAVAILLER SUR UNE COPIE LOCALE # DE LA PAGE HTML À TRAITER AFIN D'ÉVITER DE SPAMMER LE SERVEUR # with open('/home/goupil/Bureau/notaries.html') as f: # html = BeautifulSoup(f.read(), 'html.parser') container = html.find('div', class_='container') for article in container.findAll('article'): try: name = article.find('h2').a.span.text adress = article.find('div', class_='location').text except AttributeError: continue adress = re.sub('\s+', ' ', adress) notaries.append( dict(name=name.strip(), adress=adress.strip()) ) return notaries def get_all_notaries(): all_notaries = [] page = 0 while True: url = ( 'https://www.notaireetbreton.bzh/annuaire-notaire' 'paged1=&page=%d' % page ) notaries = get_notaries(url) if not notaries: # Donc une liste vide # Cela signifie qu'on a accédé à une page n'ayant plus de tag # article dans le html, donc plus besoin de continuer break all_notaries.extend(notaries) page += 1 # Afin de respecter le server de ce site et aussi éviter # le ban ip même si c'est bien plus long à traiter... time.sleep(random.randrange(8, 16) / 10) return all_notaries def save_notaries(file_path, notaries): with open(file_path, 'w', newline='') as csv_file: writer = csv.DictWriter( csv_file, notaries[0].keys(), delimiter='|' ) writer.writeheader() writer.writerows(notaries) # notaries = get_notaries('plip') notaries = get_all_notaries() # Sur n'importe quel système on utilise le / comme séparateur de # fichiers et pas cet affreux \ de windows ! save_notaries('./notaries.csv', notaries)
Tout ce qu'il y a dans ce simple script est loin d'être complexe.
Tu devrais vraiment cesser de vouloir faire des choses élaborées alors que tu ne comprends rien à ce que tu fais.
Et viens pas me dire que ce code ne fonctionne pas, s'il ne fonctionne pas, c'est que tu auras encore sans doute modifié des choses au p'tit bonheur la chance.
Programmer c'est comprendre ce que l'on fait, savoir lire de la documentation, faire de simples tests de petits bouts de codes, etc, etc. Mais certainement pas comme tu le fais.
Bonne chance si tu continues dans cet optique ;-)
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 :-)
Modifié le 31 mai 2024 à 16:43
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 ...
Modifié le 31 mai 2024 à 16:44
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
30 mai 2024 à 18:09
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.
31 mai 2024 à 09:43
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 !
31 mai 2024 à 16:53
Bonjour Quentin,
Je me joins aux nombreux messages d'encouragements que tu as déjà reçu et te souhaite d'acquérir les connaissances qui te seront nécessaires pour atteindre tes objectifs.
Tu as déjà démontré que tu avais deux qualités essentiels pour apprendre : la persévérance et la motivation. Les autres clés pour atteindre le succès sont
- l'autonomie (savoir où chercher l'information, dans la documentation, sur des forums, etc.),
- la compréhension (comment adapter ce que tu as appris ou les exemples trouvés sur Internet à tes cas d'usages)
- la curiosité (est-ce qu'il existe des implémentations plus efficaces ou élégantes).
... et tu en as sûrement déjà certaines d'entre elles, au moins partiellement ;-)
Concernant le sujet initial, as-tu encore des questions, ou peut-on basculer le sujet en résolu ?
31 mai 2024 à 22:09
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.
1 juin 2024 à 00:39
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.
Modifié le 1 juin 2024 à 08:53
Merci chef ! On dirait ici que le professeur est un prof pour les nuls... :)
1 juin 2024 à 10:15
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.
1 juin 2024 à 12:53
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.
Modifié le 1 juin 2024 à 18:17
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.
26 mai 2024 à 15:23
C'est à dire ? Il y à bien un "print"