Je voudrais gratter une liste d'éléments d'un site Web et conserver l'ordre dans lequel ils sont présentés. Ces éléments sont organisés dans un tableau, mais ils peuvent être l'une des deux classes différentes (dans un ordre aléatoire).
Existe-t-il un moyen de fournir plusieurs classes et que BeautifulSoup4 trouve tous les éléments qui se trouvent dans l'une des classes données?
J'ai besoin de réaliser ce que fait ce code, sauf de conserver l'ordre des éléments tel qu'il était dans le code source:
items = soup.findAll(True,{'class':'class1'})
items += soup.findAll(True,{'class':'class2'})
tu peux le faire
soup.findAll(True, {'class':['class1', 'class2']})
exemple:
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<html><body><div class="class1"></div><div class="class2"></div><div class="class3"></div></body></html>')
>>> soup.findAll(True, {"class":["class1", "class2"]})
[<div class="class1"></div>, <div class="class2"></div>]
Je suis nouveau sur Python avec BeautifulSoup mais ma réponse peut vous aider. Je suis tombé sur la même situation où je dois trouver plusieurs classes d'une même balise donc je passe juste les classes dans un tableau et ça marche pour moi. Voici l'extrait de code
//Search with single Class
find_all("tr", {"class":"abc"})
//Search with multiple classes
find_all("tr", {"class": ["abc", "xyz"]})
Une façon de le faire est d'utiliser une expression régulière au lieu d'un nom de classe:
import re
import requests
from bs4 import BeautifulSoup
s = requests.Session()
link = 'https://leaderboards.guildwars2.com/en/na/achievements'
r = s.get(link)
soup = BeautifulSoup(r.text)
for item in soup.findAll(True, {"class": re.compile("^(equal|up)$")}):
if 'achievements' in item.attrs['class'] and 'number' in item.attrs['class']:
print item
Ou ceci avec la version la plus récente de BeautifulSoup:
soup.find_all('a', class_=['class1', 'class2'])
Utiliser "class" retournerait une erreur donc ils utilisent "class_" à la place.
Peut-être parce que "classe" est un mot-clé dans Python (3?).