如何用BeautifulSoup获取特定层级结构下带属性的td标签文本?
问题分析与解决
你的代码返回空列表主要有两个问题:
- CSS选择器逻辑错误:
.stats_table:has(> [data-row])里的>是直接子元素选择器,但tr[data-row]嵌套在<tbody>里,并不是<table>的直接子元素,所以这个选择器匹配不到任何元素。 - 目标元素定位错误:你要抓取的是
<td>的文本,但原代码选择的是<table>元素,方向不对。
修正后的代码
直接定位到目标<td>元素,使用精准的层级选择器:
import requests from bs4 import BeautifulSoup response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 精准定位到符合层级要求的td标签 target_tds = soup.select("div.stats-table table.stats_table tr[data-row] td[data-stat]") # 提取所有td的文本 all_data = [td.get_text(strip=True) for td in target_tds] print(all_data)
进阶:按行整理数据(更实用)
如果想把每一行的统计数据整理成字典(把data-stat属性作为键,文本作为值),可以这样写:
import requests from bs4 import BeautifulSoup response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 先获取所有符合条件的行 target_rows = soup.select("div.stats-table table.stats_table tr[data-row]") all_rows_data = [] for row in target_rows: row_data = {} # 遍历当前行的所有td for td in row.select("td[data-stat]"): stat_key = td["data-stat"] stat_value = td.get_text(strip=True) row_data[stat_key] = stat_value all_rows_data.append(row_data) # 打印整理后的数据 for idx, data in enumerate(all_rows_data): print(f"第{idx+1}行数据:{data}")
内容的提问来源于stack exchange,提问作者Kamal Moha
相关产品推荐
相关产品推荐

