web-dev-qa-db-fra.com

BeautifulSoup findAll () compte tenu de plusieurs classes?

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'})
38
sebo

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>]
63
Roman Pekar

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"]})
14
Bhoopi

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
9
alecxe

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?).

1
Abdelghani Bekka