Code python qui ne s'imprime pas

Résolu
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 - Modifié le 27 mai 2024 à 12:57
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 - 1 juin 2024 à 18:13

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


A voir également:

20 réponses

yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024 1 532
Modifié le 26 mai 2024 à 15:17

nonjour,

ne devrais-tu pas faire appel à ces fonctions?  

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
26 mai 2024 à 15:23

C'est à dire ? Il y à bien un "print"

0
yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024 1 532
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()?

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
26 mai 2024 à 16:28

A la ligne 18, je donne la définition de parse_all_attorneys

0
yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024 1 532
26 mai 2024 à 17:37

En effet, cette fonction est définie, et elle n'est jamais appelée.

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024
26 mai 2024 à 17:54

j'ai fais print(url) ou print(parse_attorney), cela ne change pas

0
yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024 1 532
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()
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
Modifié 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/)

0
jordane45 Messages postés 38238 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 septembre 2024 4 689
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...

2
yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024 1 532
26 mai 2024 à 19:14

regarde la ligne 19 du code que tu as partagé au départ de cette discussion

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024
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 !

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
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}

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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.

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
26 mai 2024 à 20:58

oui, c'est modifié, et je ne sais pas pourquoi, regarde mon Edit ci-dessus

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024
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 ?

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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 ?


0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
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

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024
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 !

0
mamiemando Messages postés 33262 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 septembre 2024 7 777 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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())
0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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()
0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024
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.

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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 ?

0
mamiemando Messages postés 33262 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 septembre 2024 7 777
28 mai 2024 à 13:59

Bonjour, lis le message #20

soup = BeautifulSoup(r.content, "html.parser")
0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > mamiemando Messages postés 33262 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 septembre 2024
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 !

0
mamiemando Messages postés 33262 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 septembre 2024 7 777 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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.

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
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
0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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. 

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
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()
0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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. 

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
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

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
28 mai 2024 à 20:40

OK, merci pour cette précision. 

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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 !

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
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 !!!!!

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024
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).

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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 !


0
yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024 1 532
29 mai 2024 à 16:52

montre ton code modifié

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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 !

0

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.

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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 !

0
yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024 1 532 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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.

0
rtm > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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....

0

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 !

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
29 mai 2024 à 19:33
0
rtm > Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024
29 mai 2024 à 20:34

En effet, désolé, je n'avais pas lu tout l'historique de ce topic ^_^

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43 > rtm
30 mai 2024 à 00:19

Ne le sois pas, moi-même, je n'aurais pas pris la peine de lire tout l'historique ^_^

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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 !

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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()










0
yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024 1 532
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?

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > yg_be Messages postés 23163 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 septembre 2024
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...

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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.

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024
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 ?

0
rtm > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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 ;-)

1

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    :-)

0
Phil_1857 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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 ...

1
rtm > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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

1
brucine Messages postés 16521 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 7 septembre 2024 2 316 > rtm
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.

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > brucine Messages postés 16521 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 7 septembre 2024
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 !

1
mamiemando Messages postés 33262 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 septembre 2024 7 777 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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 ?

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279
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.


0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
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.

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024
Modifié le 1 juin 2024 à 08:53

Merci chef ! On dirait ici que le professeur est un prof pour les nuls... :)

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43 > quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024
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.

0
quentin2121 Messages postés 8894 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 5 septembre 2024 1 279 > Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024
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. 

0
Diablo76 Messages postés 202 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 19 juillet 2024 43
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.

0