2
votes

Résultats du filtre Beautifulsoup "find_all", limités au fichier .jpeg via Regex

Je souhaite acquérir des photos d'un forum. Les résultats de find_all me donnent le plus ce que je veux, qui sont des fichiers jpeg. Cependant, cela me donne aussi quelques fichiers gif que je ne désire pas. Un autre problème est que le fichier gif est une pièce jointe, pas un lien valide, et cela pose des problèmes lorsque j'enregistre des fichiers.

soup_imgs = soup.find(name='div', attrs={'class':'t_msgfont'}).find_all('img', alt="")
for i in soup_imgs:
    src = i['src']
    print(src)

J'ai essayé d'éviter que les fichiers gif dans ma recherche de sélections find_all, mais inutile, les fichiers jpeg et gif sont dans la même section. Que dois-je faire pour filtrer mon résultat alors? S'il vous plaît, aidez-moi, chef. Je suis assez amateur de codage. Jouer avec Python n'est qu'un de mes passe-temps.


1 commentaires

pourriez-vous fournir un exemple de sortie et un code supplémentaire (fournir une URL de site factice si vous le souhaitez)? aussi, ne connaissant pas les détails, avez-vous essayé une simple condition «if» pour filtrer?


3 Réponses :


2
votes

Essayez ce qui suit que je suppose que vous pouvez raccourcir. Il utilise l'opérateur se termine par ($) pour spécifier que la valeur des attributs src des éléments img enfants se termine par .jpg (modifié en jpg à partir de jpeg à la lumière du commentaire de OP selon lequel il s'agit en fait de jpg)

srcs = [item['src'] for item in soup.select(".t_msgfont [src$='.jpg']")]

Jetez un œil à raccourcir le sélecteur (je ne peux pas sans voir le HTML en question), vous pourriez bien vous en tirer avec quelque chose comme

srcs = [item['src'] for item in soup.select(".t_msgfont [alt=''][src$='.jpg']")]

ou même p>

srcs = [item['src'] for item in soup.select("div.t_msgfont img[alt=''][src$='.jpg']")]


7 commentaires

dois-je importer quelque chose pour utiliser "$"? Il semble que mon script continue de me donner une syntaxe invalide.


Essayez maintenant. Je n'avais pas changé le "" intérieur en ""


bizarre, ça tourne, mais aucun résultat de [src $ = '. jpeg'], j'ai vérifié l'extension du fichier, ils sont jpg, quand je me débarrasse du "e", erreur de syntaxe ...


Donc, vous obtenez cette erreur avec srcs = [item ['src'] pour l'article dans soup.select ("div.t_msgfont img [alt = ''] [src $ = '. Jpg']")]


Essayez ce qui précède et essayez aussi srcs = [item ['src'] pour l'article dans soup.select (". T_msgfont [src $ = 'jpg']")]


Pas de soucis bien que je sois un peu confus quant à la façon dont l'autre solution fonctionnait si l'extension est en fait jpg?


Je ne suis pas sûr non plus, import re, re.compile a fonctionné d'une manière ou d'une autre, je dois le chercher dans les livres. Je n'ai pas encore atteint la section re.



2
votes

Vous pouvez le filtrer via une expression régulière. Veuillez vous référer à l'exemple suivant. J'espère que cela vous aidera.

import re
from bs4 import BeautifulSoup

data='''<html>
<body>

<h2>List of images</h2>

<div class="t_msgfont">
<img src="img_chania.jpeg" alt="" width="460" height="345">
<img src="wrongname.gif" alt="">
<img src="img_girl.jpeg" alt="" width="500" height="600">
</div>
</body>
</html>'''

soup=BeautifulSoup(data, "html.parser")
soup_imgs = soup.find('div', attrs={'class':'t_msgfont'}).find_all('img', alt="" ,src=re.compile(".jpeg"))
for i in soup_imgs:
    src = i['src']
    print(src)


2 commentaires

src = re.compile (". jpeg") l'a cloué, puissant! Merci mon pote


Heureux de vous aider



2
votes

Je vous suggère d'utiliser requests-html pour trouver les ressources image dans la page. C'est assez simple comparé aux requêtes BeautifulSoup + .

Voici le code pour le faire.

from requests_html import HTMLSession
session = HTMLSession()
resp = session.get(url)
for i in resp.html.absolute_links:
    if i.endswith('.jpeg'):
        print(i)


1 commentaires

merci chef, je vais l'examiner. J'ai beaucoup à réviser pour mes codes d'amateurs.