BeautifulSoup findAll() à plusieurs classes?

je voudrais gratter une liste d'articles d'un site web, et préserver l'ordre dans lequel ils sont présentés. Ces articles sont organisés dans un tableau, mais ils peuvent être une de deux classes différentes (dans l'ordre aléatoire).

Est-il possible de fournir plusieurs classes et ont BeautifulSoup4 trouver tous les éléments qui sont dans l'une des catégories?

j'ai besoin pour atteindre ce que ce code n', à l'exception de conserver l'ordre des éléments, car elle était dans le code source:

items = soup.findAll(True,{'class':'class1'})
items += soup.findAll(True,{'class':'class2'})
33
demandé sur alecxe 2013-09-10 21:53:22

3 réponses

vous pouvez 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>]
49
répondu Roman Pekar 2013-09-10 18:08:06

Une façon de le faire est d'utiliser l'expression régulière à la place 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
répondu alecxe 2013-09-10 19:01:36

je suis nouveau en Python avec BeautifulSoup mais peut - être que ma réponse vous aidera. Je suis tombé sur la même situation où je dois trouver plusieurs classes d'une étiquette donc, je passe juste les classes dans un tableau et cela fonctionne 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"]})
8
répondu BHUPI 2017-08-12 07:24:34