これらのアイテムはテーブルに整理されていますが、2つの異なるクラスのいずれか(ランダムな順序)にすることができます。
複数のクラスを提供し、BeautifulSoup4が指定されたクラスのいずれかにあるすべてのアイテムを検索する方法はありますか?
ソースコードと同じようにアイテムの順序を保持することを除いて、このコードの機能を実現する必要があります。
items = soup.findAll(True,{'class':'class1'})
items += soup.findAll(True,{'class':'class2'})
あなたはこれを行うことができます
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>]
私はBeautifulSoupでPythonを初めて使用しますが、私の答えはあなたを助けるかもしれません。それは私のために働いています。ここにコードスニペットがあります
//Search with single Class
find_all("tr", {"class":"abc"})
//Search with multiple classes
find_all("tr", {"class": ["abc", "xyz"]})
それを行う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
または、BeautifulSoupの最新バージョンを使用した場合:
soup.find_all('a', class_=['class1', 'class2'])
「class」を使用するとエラーが返されるため、代わりに「class_」を使用します。
「クラス」はPython(3?)のキーワードだからでしょう。