无法从Soup提取文本:如何提取HTML表格中的191.1股价数值?
解决BeautifulSoup提取股价数值191.1的方案
我来帮你搞定这个问题!首先看你提供的HTML代码里有个小错误——<td class="stoksPrice">191.1</td>前面少了一个左尖括号<,这会导致解析出错,先假设实际页面的HTML是完整正确的,下面给你几种可靠的提取方法:
方法1:精准CSS选择器排除空元素
目标数值所在的td标签虽然有stoksPrice类,但另一个同类别td带有realTimChange类且内容为空,我们可以用CSS选择器直接筛选出不带realTimChange的stoksPrice元素:
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




