77

Web サイトからアイテムのリストをスクレイピングし、それらが表示される順序を保持したいと考えています。これらのアイテムは表にまとめられていますが、2 つの異なるクラスのいずれかになる可能性があります (ランダムな順序で)。

複数のクラスを提供し、指定されたクラスのいずれかにあるすべてのアイテムを BeautifulSoup4 に見つけさせる方法はありますか?

ソース コードと同じように項目の順序を保持することを除いて、このコードが行うことを達成する必要があります。

items = soup.findAll(True,{'class':'class1'})
items += soup.findAll(True,{'class':'class2'})
4

6 に答える 6

103

あなたはこれを行うことができます

soup.findAll(True, {'class':['class1', 'class2']})

例:

>>> 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>]
于 2013-09-10T18:08:06.090 に答える
13

これを行う 1 つの方法は、クラス名の代わりに正規表現を使用することです。

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
于 2013-09-10T17:56:36.710 に答える
13

または、最新バージョンの BeautifulSoup を使用すると、次のようになります。

find_all('a', class_=['class1', 'class2'])

「class」を使用するとエラーが返されるため、代わりに「class_」を使用します。

于 2019-03-15T23:08:09.013 に答える