web-dev-qa-db-ja.com

BeautifulSoup findAll()に複数のクラスが指定されていますか?

これらのアイテムはテーブルに整理されていますが、2つの異なるクラスのいずれか(ランダムな順序)にすることができます。

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

ソースコードと同じようにアイテムの順序を保持することを除いて、このコードの機能を実現する必要があります。

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

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

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

私はBeautifulSoupでPythonを初めて使用しますが、私の答えはあなたを助けるかもしれません。それは私のために働いています。ここにコードスニペットがあります

//Search with single Class
    find_all("tr",  {"class":"abc"})
//Search with multiple classes
    find_all("tr",  {"class": ["abc", "xyz"]})
14
Bhoopi

それを行う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
9
alecxe

または、BeautifulSoupの最新バージョンを使用した場合:

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

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

「クラス」はPython(3?)のキーワードだからでしょう。

1