Code python qui ne s'imprime pas
RésoluDiablo76 Messages postés 245 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
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
- Code python qui ne s'imprime pas
- Code ascii - Guide
- Citizen code python avis - Accueil - Outils
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
20 réponses
nonjour,
ne devrais-tu pas faire appel à ces fonctions?
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
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 questionJ'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/)
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}
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
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 !
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())
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()
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 ?
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 !!!!!
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 !
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
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()
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.
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 :-)
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
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.
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 !
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 ?
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.
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.
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.
C'est à dire ? Il y à bien un "print"