我想从网站上抓取一个项目列表,并保留它们的显示顺序。这些项目按表格组织,但它们可以是两个不同类别之一(按随机顺序)。< / p>
有没有办法提供多个类,并让BeautifulSoup4查找任何给定类中的所有项目?
我需要实现此代码的功能,除了保留源代码中的项目顺序:
items = soup.findAll(True,{'class':'class1'})
items += soup.findAll(True,{'class':'class2'})
答案 0 :(得分:59)
你可以这样做
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>]
答案 1 :(得分:9)
一种方法是使用正则表达式而不是类名:
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
答案 2 :(得分:6)
<html>
<body>
<div class="cls1">ok</div>
<div class="cls2">hi</div>
<div class="cls1 cls2">both</div>
</body>
</html>
假设 html 变量包含上面的 html 代码
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
divs = soup.find_all('div', class_=['cls1', 'cls2'])
print(divs)
这将输出:
[<div class="cls1">ok</div>, <div class="cls2">hi</div>, <div class="cls1 cls2">both</div>]
它是一个“OR”运算符而不是一个“AND”,即元素不需要同时具有这两个类。
要使用“AND”运算符,您可以使用 select('div.cls1.cls2')
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
divs = soup.select('div.cls1.cls2')
print(divs)
这将输出:
[<div class="cls1 cls2">both</div>]
答案 3 :(得分:0)
或者在BeautifulSoup的最新版本中使用:
soup.find_all('a', class_=['class1', 'class2'])
使用“ class”会返回错误,因此他们改用“ class _”。
也许是因为“ class”是Python(3?)中的关键字。