如何将HTML个标签的属性值取到列表中?

How to get attribute values of HTML tags into a list?

我想从 table 行的列表中提取“id”属性的值,如下所示: <tr id="8LVPCRJGR" role="row" class="odd">,来自 BeautifulSoup4。对于这个示例标签,我想要“8LVPCRJGR”部分。

我尝试了这段代码(是的,我确实导入了 bs4 并请求了模块):

url = "https://brawlify.com/stats/club/V8GVVR0R"
result = requests.get(url).text
doc = BeautifulSoup(result, "html.parser")

tag = doc.find_all('tr')

attribute = tag['id']

print(attribute)

它应该打印出一个包含所有值的列表,但是什么也没有打印出来。控制台是空白的。

我做错了什么?

find_all 将 return 一个列表

你应该遍历这个列表并像这样提取 id 属性

编辑

关注@chitown88 评论 你可以将 if 语句标识到循环中 以及@Zaid Hussain 的评论 显然你无法从 HTML 页面获取 tr 标签,因为 javascript 代码在加载 requests.get(url).text 到 BeautifulSoup 之前没有执行 我会推荐尝试检查 requests.get(url).text 的 return,如果是这种情况,我建议通过例如 chrome 驱动程序使用 selenium 打开页面并将 HTML 代码传递给 BeatifulSoup或者只是用 Selenium

来完成这项工作
tags=doc.find_all('tr')
attribute= [tag['id'] for tag in tags if tag['id'] ]
print(attribute)

几个问题。首先,标签是元素列表,特别是所有 <tr> 标签元素。其次,并非所有 <tr> 标签都有 'id' 属性。

因此您需要为此添加一些逻辑:

import requests
from bs4 import BeautifulSoup


url = "https://brawlify.com/stats/club/V8GVVR0R"
result = requests.get(url).text
doc = BeautifulSoup(result, "html.parser")

tag = doc.find_all('tr')

attribute = [x['id'] for x in tag if 'id' in x.attrs]

输出:

print(attribute)
['8LVPCRJGR', '29G9VJJC', '2YP08GUG8', 'UY8PVUPL', 'VV2RRRGG', '20RQQ08U9', 'VJ00J8Y8', '200PG2VLP', '28QV0RJVV', 'YRLPJ80J', 'PRLV99U89', '9QJLQGGU', '88UYYG0U', '9PG8RUVJ', 'YP9UQ8CQ', '9J8LRGQU2', '2LPGYQVV9', '8C8CJ0UJU', 'GUGJLLRG', '9Q0VCV2J', '2RVYVL8YL', 'JP0VGC2P', '280GY2R2C', '2PRLQPJJY', '8CGJGPYJ9', '89RYCVQJ0', '80GVU28CC', 'UV0CPU2Q', '9RGG9J08J', 'Y2PQ8090R']

Select 更具体一些 - 所有 <tr> 都带有 id 并迭代结果集以获得每个 id:

[x['id'] for x in soup.select('tr[id]')]

例子

import requests
from bs4 import BeautifulSoup

r = requests.get('https://brawlify.com/stats/club/V8GVVR0R')
soup = BeautifulSoup(r.text, "html.parser")

attribute = [x['id'] for x in soup.select('tr[id]')]
print(attribute)

输出:

['8LVPCRJGR',
 '29G9VJJC',
 '2YP08GUG8',
 'UY8PVUPL',
 'VV2RRRGG',
 '20RQQ08U9',
 'VJ00J8Y8',
 '200PG2VLP',
 '28QV0RJVV',...]