You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup4高效提取指定<tr>节点的<td>文本数据?

如何用更简洁的方式从BeautifulSoup结果中提取指定文本并汇总?

我通过以下代码获取了soup对象:

soup = BeautifulSoup(html, 'lxml').find("tbody").find_all("tr")

这个对象包含多个类似这样的<tr>节点:

<tr> 
  <td class="table">115</td> 
  <td>204</td> 
  <td><div><span class="flag-icon"></span> United States <span> NY </span></div></td> 
  <td>brown</td> 
  <td>up</td> 
  <td class="table">groove</td> 
</tr>

我的需求是提取每个<tr>中第1、2、4个<td>的去空格文本,组成小列表(比如[115, 204, 'brown']),再将所有小列表汇总为大列表(比如[[115, 204, 'brown'], [32, 12, 'red'], ..., [42, 87, 'yellow']])。目前我用两层for循环实现,但希望借助BeautifulSoup的特性找到更简洁的方法,请问有什么思路?


简洁实现思路:结合列表推导式与BeautifulSoup的文本处理能力

其实完全不用两层循环,用Python的列表推导式配合BeautifulSoup自带的文本处理方法,就能写出既简洁又易读的代码,下面给你两种实用方案:

方案1:索引定位+get_text(strip=True)

直接通过索引选取每个<tr>里的目标<td>,用get_text(strip=True)一键完成去空格(包括前后空白、中间换行和多余空格):

from bs4 import BeautifulSoup

# 先拆分原代码,提升可读性
soup = BeautifulSoup(html, 'lxml')
tr_list = soup.find("tbody").find_all("tr")

# 核心逻辑:一行生成目标大列表
result = [
    [
        tr.find_all("td")[0].get_text(strip=True),
        tr.find_all("td")[1].get_text(strip=True),
        tr.find_all("td")[3].get_text(strip=True)
    ]
    for tr in tr_list
]

如果需要把前两个数字转成整数类型,直接在推导里加类型转换即可:

result = [
    [
        int(tr.find_all("td")[0].get_text(strip=True)),
        int(tr.find_all("td")[1].get_text(strip=True)),
        tr.find_all("td")[3].get_text(strip=True)
    ]
    for tr in tr_list
]

方案2:CSS选择器定位(语义更清晰)

如果担心后续HTML结构微调导致索引失效,可以用CSS伪类直接匹配每个<tr>下的第1、2、4个<td>,代码语义更直观:

result = [
    [td.get_text(strip=True) for td in tr.select("td:nth-of-type(1), td:nth-of-type(2), td:nth-of-type(4)")]
    for tr in tr_list
]

td:nth-of-type(n)是CSS原生的伪类选择器,专门用来匹配父元素下的第n个指定类型子节点,完全符合你的需求。

为什么这比两层循环更好?

列表推导式是Python处理"遍历-转换-收集"场景的语法糖,配合BeautifulSoup的节点选择和文本处理能力,把原本需要外层循环遍历<tr>、内层处理<td>的逻辑压缩成了紧凑的代码,同时避免了手动写strip()这类重复逻辑,既简洁又可靠。

内容的提问来源于stack exchange,提问作者Quanti Monati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:42:11