3 Réponses :
Vous pouvez trouver la balise de script appropriée et regexer les informations. J'ai supposé que la première balise de script contenant window._sharedData =
est la bonne. Vous pouvez bricoler si nécessaire.
soup = bs(html, 'lxml') r = re.compile(r'"display_url":(.*)",') data = soup.find('script', text=r).text print(r.findall(data))
Grâce à @thadam, il peut être possible de raccourcir ce qui précède en:
from bs4 import BeautifulSoup as bs import re html = ''' <html> <head></head> <body class=""> <span id="react-root"> <svg width="50" height="50" viewbox="0 0 50 50" style="position:absolute;top:50%;left:50%;margin:-25px 0 0 -25px;fill:#c7c7c7"> <path d=" <!ââdeleted part for privacy --> " /> </svg></span> <script type="text/javascript"> window._sharedData = { "config": { "csrf_token": "", "viewer": { <!ââdeleted part for privacy --> "viewerId": "" }, "supports_es6": true, "country_code": "FR", "language_code": "fr", "locale": "fr_FR", "entry_data": { "PostPage": [{ "graphql": { "shortcode_media": { "__typename": "GraphSidecar", <!ââdeleted part for privacy --> "dimensions": { "height": 1080, "width": 1080 }, "gating_info": null, "media_preview": null, <--There's the important part that have to be extracted as many times it appear in the source code--> "display_url": "https://scontent-cdt1-1.cdninstagram.com/vp/", "display_resources": [{ "src": "https://scontent-cdt1-1.cdninstagram.com/vp/", "config_width": 640, "config_height": 640 }, { "src": "https://scontent-cdt1-1.cdninstagram.com/vp/", "config_width": 750, "config_height": 750 }, { "src": "https://scontent-cdt1-1.cdninstagram.com/vp/", "config_width": 1080, "config_height": 1080 }], "is_video": false,</script> </body> </html> ''' soup = bs(html, 'lxml') scripts = soup.select('script[type="text/javascript"]') for script in scripts: if ' window._sharedData =' in script.text: data = script.text break r = re.compile(r'"display_url":(.*)",') print(r.findall(data))
p >
Vous pouvez raccourcir votre code si vous utilisez votre regex comme paramètre text
dans .find ()
, par exemple: data = soup.find ('script', text = r) .text
Vous êtes les bienvenus! Parfois, il est préférable d'utiliser .find ()
/ .find_all ()
car ils acceptent les expressions régulières et les fonctions.
Salut. En essayant l'idée @thadam dans mon logiciel, le résultat est devenu: Fichier "main.py", ligne 27, dans
les données sont-elles chargées dynamiquement? imprimer la soupe et vérifier
Impossible de l'imprimer car: dans
changer lxml pour html.parser
Pardon comment ce lien? J'utilise des requêtes
comment votre commentaire de code se rapporte-t-il à ma réponse s'il vous plaît?
Désolé j'ai pensé que c'était là pour expliquer l'avancement de mon projet mais j'ai corrigé ma faute avec la nouvelle réponse :( [donc j'ai supprimé mes faux commentaires]
Le programme a avancé et il est devenu quelque chose comme ceci:
thepage = urllib.request.urlopen(html) soup = BeautifulSoup(thepage, "html.parser") print(soup.title.text) txt = soup.select('script[type="text/javascript"]')[3] texte = txt.get_text() f1 = open("tet.txt", 'w') f1.write(texte) f1.close() with open('tet.txt','r') as f: data=''.join(f.readlines()) print(data[data.index('"display_url":"'):data.index('","display_resources":')+1])
Mais maintenant quelque chose de nouveau est apparu:
Voici le code pour télécharger plusieurs images à partir d'une url instagram avec Pythonista 3 sur iOS:
from sys import argv import urllib import urllib.request from bs4 import BeautifulSoup import re import photos import clipboard thepage = "your url" #p.1 thepage = urllib.request.urlopen(html) soup = BeautifulSoup(thepage, "html.parser") print(soup.title.text) txt = soup.select('script[type="text/javascript"]')[3] texte = txt.get_text() fille = open("tet.txt", 'w') fille.write(texte) fille.close() #p.2 g = open('tet.txt','r') data=''.join(g.readlines()) le1 = 0 le2 = 0 hturl = open('url.html', 'w') still_looking = True while still_looking: still_looking = False dat = data.find('play_url', le1) det = data.find('play_resources', le2) if dat >= le1: #urls.append(dat) le1 = dat + 1 still_looking = True if det >= le2: hturl.write(data[dat:det]) le2 = det + 1 still_looking = True hturl.close() #p.3 hturl2 = open('url.html', 'r') dete = ''.join(hturl2.readlines()) le11 = 0 le22 = 0 urls = [] still_looking2 = True while still_looking2: still_looking2 = False dat2 = dete.find('https://scontent-', le11) det2 = dete.find('","dis', le22) if dat2 >= le11: urls.append(dat2) le11 = dat2 + 1 still_looking2 = True if det2 >= le22: urls.append(dete[dat2:det2]) le22 = det2 + 1 still_looking2 = True hturl2.close() #p.4 imgs = len(urls) nbind = imgs nbindr = 3 images = 1 while nbindr < imgs: urllib.request.urlretrieve(urls[nbindr], 'photo.jpg') photos.create_image_asset('photo.jpg') print ('Image ' + str(images) + ' downloaded') nbindr = nbindr +2 images += 1 print("OK")
C'est un peu fastidieux mais cela fonctionne et rapidement aussi . Merci pour votre aide.
Avez-vous quelques exemples d'URL avec lesquels travailler?
Oui et non. Oui, toute page de publication de page qui contient plusieurs images (dans le style carrousel) mais les pages sont générées par intagram avec notre jeton d'utilisateur unique, donc je ne peux pas vraiment vous la transmettre telle quelle ... :(
Oui donc pour ça j'ai essayé d'ajouter une partie d'un code source ... ^^
saisir la balise de script appropriée et la regexer