如何将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',...]
我想从 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',...]