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