Python BeautifulSoup findAll()给定多个类?
我想从一个网站上抓取一个项目列表,并保留它们呈现的顺序。这些项目组织在一个表中,但它们可以是两个不同类中的一个(以随机顺序) 有没有办法提供多个类并让BeautifulSoup4查找任何给定类中的所有项 我需要实现这段代码的功能,除了保留源代码中项目的顺序:Python BeautifulSoup findAll()给定多个类?,python,html,beautifulsoup,html-parsing,Python,Html,Beautifulsoup,Html Parsing,我想从一个网站上抓取一个项目列表,并保留它们呈现的顺序。这些项目组织在一个表中,但它们可以是两个不同类中的一个(以随机顺序) 有没有办法提供多个类并让BeautifulSoup4查找任何给定类中的所有项 我需要实现这段代码的功能,除了保留源代码中项目的顺序: items = soup.findAll(True,{'class':'class1'}) items += soup.findAll(True,{'class':'class2'}) 一种方法是使用正则表达式而不是类名: import
items = soup.findAll(True,{'class':'class1'})
items += soup.findAll(True,{'class':'class2'})
一种方法是使用正则表达式而不是类名:
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
你可以这样做
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>]
>>来自bs4导入组
>>>汤=美汤(“”)
>>>findAll(True,{“class”:[“class1”,“class2”]})
[, ]
我对使用BeautifulSoup的Python还不熟悉,但也许我的答案对您有所帮助。我遇到了同样的情况,我必须找到一个标记的多个类,因此,我只需将这些类传递到一个数组中,它对我有效。
下面是代码片段
# Search with single Class
find_all("tr", {"class":"abc"})
# Search with multiple classes
find_all("tr", {"class": ["abc", "xyz"]})
或者使用更新版本的BeautifulSoup:
find_all('a', class_=['class1', 'class2'])
使用“class”会返回一个错误,所以他们会使用“class”。
好啊
你好
二者都
假设html变量包含上面的html代码
从bs4导入美化组
soup=BeautifulSoup(html)
divs=soup.find_all('div',class_=['cls1','cls2'])
打印(divs)
这将输出:
[<div class="cls1">ok</div>, <div class="cls2">hi</div>, <div class="cls1 cls2">both</div>]
[<div class="cls1 cls2">both</div>]
这将输出:
[<div class="cls1">ok</div>, <div class="cls2">hi</div>, <div class="cls1 cls2">both</div>]
[<div class="cls1 cls2">both</div>]
[两者]
感谢您的快速回复。现在,这个电话没有返回任何信息。这是否可能是由于类名中存在空格造成的?(例如,“类1”)对不起,我对正则表达式一无所知。@sebo您能展示一下您正在使用的代码,以便我可以重现并解决问题吗?当我将代码分解时,这就是我正在查看的代码:import requests from bs4 import BeautifulSoup s=requests.Session()链接https://leaderboards.guildwars2.com/en/na/achievements'r=s.get(link)soup=BeautifulSoup(r.text)items=soup.findAll(True,{“class”:[“相等成就数”,“向上成就数”]})
这一个应用了Roman Pekar的解决方案,但它返回一个空列表。使用正则表达式解决方案也会发生同样的情况。不过,一次检索一个类也可以。抱歉,格式太糟糕了。@sebo是否正在运行soup.findAll(True,{“类”:“.*acquisitions number.*”})
?它还返回一个空列表。在我的代码中,它返回一个空列表的方式与alecxe的解决方案相同。请参阅他对我的代码的回复下的注释。@sebo请尝试以下内容:soup.findAll(True,{“class”:[“equal”,“up”]})
@alecxe此功能对您有效,+1,但仍在尝试找到如何使用完整的类来实现此功能names@RomanPekar非常感谢。我认为bs4
没有将class
过滤器应用于整个class
属性值,而是按空间分割类。请参阅。@RomanPekar我认为有一种解决方法-在循环中添加一个附加检查,请参阅我的更新答案。你觉得怎么样?谢谢alecxe和Roman Pekar帮我解决这个问题。我能够使用部分类名和alecxe更新答案中建议的附加检查来实现我想要的对应于或
选择器或和
选择器?它对应于或
如何设置它和
?您可以使用选择
而不是全部查找
@SundeepPidugu选择('div.abc.xyz')
这是或
,有关和
请参阅其他答案的注释。