Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python BeautifulSoup findAll()给定多个类?_Python_Html_Beautifulsoup_Html Parsing - Fatal编程技术网

Python BeautifulSoup findAll()给定多个类?

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

我想从一个网站上抓取一个项目列表,并保留它们呈现的顺序。这些项目组织在一个表中,但它们可以是两个不同类中的一个(以随机顺序)

有没有办法提供多个类并让BeautifulSoup4查找任何给定类中的所有项

我需要实现这段代码的功能,除了保留源代码中项目的顺序:

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')
这是
,有关
请参阅其他答案的注释。