Bonjour,
J'avais un programme, il y a longtemps, qui fonctionnait avec request et qui me téléchargeait les ingrédients et la recette lorsqu'une url marmiton était passée en argument.
Cela ne fonctionne plus car le site change régulièrement de structure.
J'aurais bien recommencé avec selenium mais je me trouve confronté au même type de pb avec une structure qui varie différemment d'une recette à l'autre au niveau du XPATH.
Voici ce que j'ai commencé à faire et qui fonctionne pour une recette mais pas pour d'autres :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
plat = "carbo-soleil"
url = "https://www.marmiton.org/recettes/recette_pates-a-la-carbonara-et-aux-legumes-du-soleil_58989.aspx"
 
# plat = "cookies"
# url = "https://www.marmiton.org/recettes/recette_cookies-maison_86989.aspx"
 
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
 
driver.get(url)
 
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "didomi-notice-agree-button"))).click()
 
images = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[3]/img')
# print(images)
 
import urllib
src = []
for img in images:
    src.append(img.get_attribute('src'))
try:
    for i in range(10):   
        urllib.request.urlretrieve(str(src[i]),"{}-{}.jpg".format(plat,str(i)))
except:
    pass
 
divers1 = driver.find_elements(by=By.XPATH, value="/html/body/div[2]/div[3]/main/div/div/div[1]/div[1]/div[4]")
divers1_splite = divers1[0].text.split("•")
divers1_splite = [el.replace("\n","") for el in divers1_splite]
duree_prep, niveau, cout = map(str,divers1_splite)
# duree_prep, niveau, cout = [el for el in divers_splite]
print("=====================")
print(duree_prep, niveau, cout)
print("=====================")
 
nb_pers = driver.find_element(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[2]/div[1]/div/span[1]')
print("pour", nb_pers.text, "personnes")
print("=====================")
 
ingred = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]/div[2]')
oignon = """//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]/div[2]/div[2]/div/span/span/div[2]/span/span[2]"""
huile = """//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]/div[2]/div[3]/div/span/span/div[2]/span/span[2]"""
for el in ingred:
    print(el.text, end = ', ')
print()
print("=====================")
 
ingredients = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]')
nb_ingred = len(ingredients)
 
print("nb d'ingredients : ", nb_ingred)
for el in ingredients:
    print(el.text, end = ' - ')
print()
print("=====================")
 
print("essai try")
try:
    for i in range(20):
        ingredients = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]/div[2]/div[{}]'.format(str(i)))
        for el in ingredients:
            print(el.text, end = ' * ')
            print()
            print("-------------------------")
except:
    pass
print("=====================")
 
print("recette :")
print()
 
tps_tot = driver.find_element(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[8]/div[1]').text
print(tps_tot)
liste_tps=[0,0,0]
try:
    for i in range(1,4):
        tps = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[8]/div[3]/div[{}]'.format(str(i)))
        for el in tps:
            liste_tps[i-1] = el.text.replace("\n","")
except:
    pass
print(liste_tps)
tps_prep,tps_repos,tps_cuiss = [el for el in liste_tps]
print("=====================")
 
driver.close()
Si vous avez des idées, je suis preneur.
Le but étant de passer ensuite via LaTeX à une version pdf sous forme de fiche.
Bonne fin de semaine à tous et toutes.