You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法从Soup提取文本:如何提取HTML表格中的191.1股价数值?

解决BeautifulSoup提取股价数值191.1的方案

我来帮你搞定这个问题!首先看你提供的HTML代码里有个小错误——<td class="stoksPrice">191.1</td>前面少了一个左尖括号<,这会导致解析出错,先假设实际页面的HTML是完整正确的,下面给你几种可靠的提取方法:

方法1:精准CSS选择器排除空元素

目标数值所在的td标签虽然有stoksPrice类,但另一个同类别td带有realTimChange类且内容为空,我们可以用CSS选择器直接筛选出不带realTimChangestoksPrice元素:

from bs4 import BeautifulSoup

# 修正后的HTML代码
html_content = '''<table class="stocksTable" summary="株価詳細"> 
<tr> 
<th class="symbol"><h1>(株)みずほフィナンシャルグループ</h1></th> 
<td class="stoksPrice realTimChange"> <div class="realTimChangeMod"> </div> </td> 
<td class="stoksPrice">191.1</td> 
<td class="change"><span class="yjSt">前日比</span><span class="icoUpGreen yjMSt">+2.5(+1.33%)</span></td> 
</tr> 
</table>'''

soup = BeautifulSoup(html_content, 'html.parser')
# 选择带有stoksPrice类但不包含realTimChange类的td
target_td = soup.select_one('td.stoksPrice:not(.realTimChange)')

if target_td:
    stock_price = target_td.get_text(strip=True)
    print(stock_price)  # 输出:191.1

方法2:通过兄弟元素定位

如果页面结构相对稳定,我们可以找到带有change类的td,然后取它的前一个兄弟元素(注意要跳过空白文本节点):

change_td = soup.find('td', class_='change')
if change_td:
    # 连续调用previous_sibling跳过空白节点,定位到目标td
    price_td = change_td.previous_sibling.previous_sibling
    stock_price = price_td.get_text(strip=True)
    print(stock_price)

方法3:按索引定位td元素

如果表格行内的td顺序固定,也可以直接通过索引取值(索引从0开始,目标是第三个td):

table_row = soup.find('tr')
all_tds = table_row.find_all('td')
if len(all_tds) >= 3:
    stock_price = all_tds[2].get_text(strip=True)
    print(stock_price)

常见失败原因分析

你之前提取失败大概率是这两个原因:

  • 误选了第一个带有realTimChange类的stoksPrice元素,它的内容是空的;
  • 原始HTML存在标签缺失(比如你贴的代码里少了<),导致BeautifulSoup解析异常。

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

火山引擎 最新活动