Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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在给定类的div中获取所有不同的属性值_Python_Html_Beautifulsoup - Fatal编程技术网

Python BeautifulSoup在给定类的div中获取所有不同的属性值

Python BeautifulSoup在给定类的div中获取所有不同的属性值,python,html,beautifulsoup,Python,Html,Beautifulsoup,假设我有一个带有div的html文件,如下所示: 嘿 是我 你好 欧拉 如何获取发送消息的所有用户的列表 如果我使用find方法,我只获得第一个用户,如果我使用find\u all我获得user1两次 我是否可以一步完成,而不删除由find_all制作的列表中的重复项?以下是我只能想到的两种方法: import bs4 r = '''<div class="message" title="user1"> <span> Hey </span> </di

假设我有一个带有div的html文件,如下所示:

嘿
是我
你好
欧拉
如何获取发送消息的所有用户的列表

如果我使用
find
方法,我只获得第一个用户,如果我使用
find\u all
我获得
user1
两次


我是否可以一步完成,而不删除由
find_all
制作的列表中的重复项?

以下是我只能想到的两种方法:

import bs4

r = '''<div class="message" title="user1"> <span> Hey </span> </div>
<div class="message" title="user1"> <span> It's me </span> </div>
<div class="message" title="user2"> <span> Hi </span> </div>
<div class="message" title="user3"> <span> Ola </span> </div>'''

soup = bs4.BeautifulSoup(r,'html.parser')
messages = soup.find_all('div', {'class':'message'})

users_list = []   

for user in messages:
    user_id = user.get('title')
    if user_id not in users_list:
        users_list.append(user_id)
导入bs4
r=''嘿
是我
你好
奥拉“
soup=bs4.BeautifulSoup(r,'html.parser')
messages=soup.find_all('div',{'class':'message'})
用户列表=[]
对于邮件中的用户:
user\u id=user.get('title')
如果用户id不在用户列表中:
用户列表。追加(用户id)

导入bs4
r=''嘿
是我
你好
奥拉“
soup=bs4.BeautifulSoup(r,'html.parser')
messages=soup.find_all('div',{'class':'message'})
用户列表=列表(为消息中的用户设置([user.get('title]))

您可以使用自定义查找器功能

seen_users = set()
def users(tag):
    username = tag.get('title')
    if username and 'message' in tag.get('class', ''):
        seen_users.add(username)
        return True

tags = soup.find_all(users)
print(seen_users)  # {'user1', 'user2', 'user3'}

如果不删除重复项,则无法“一步到位”。正常的过程是抓取所有匹配元素,然后过滤这些结果以确定其唯一性。是的,@Ouroborus是对的。您需要将返回的列表设置为一个集合。这类似于字典上的
get
方法。基本上,您可以检索标记的
class
属性。如果不存在,则返回值
'
(空字符串)。我们使用它是因为默认的
None
会导致错误。如果您尝试
,如果“无”中的“消息”将引发错误,则类似。哦,现在我明白了。另外,在
tags=soup.find_all(users)
中,我不应该传递参数吗?如果我理解得很好,那么标记值是否正确?当您将一个可调用(函数)传递给
find_all
时,
soup
中的每个标记都会调用它。如果函数返回
True
,则会将标记添加到结果集中。详见文档。
seen_users = set()
def users(tag):
    username = tag.get('title')
    if username and 'message' in tag.get('class', ''):
        seen_users.add(username)
        return True

tags = soup.find_all(users)
print(seen_users)  # {'user1', 'user2', 'user3'}