使用Beautiful Soup的find()函数提取网页表格特定数值遇到困难
如何用Beautiful Soup提取指定行业的Fund数值
没问题,我来帮你精准提取这个11.95的数值!先看看你的HTML结构:目标数值是Consumer Cyclical行业对应的Fund列数据,嵌套在该行的第二个<td>里的<span>标签中。这里给你两种可靠的提取方法:
方法一:通过行业文本逐层定位(直观易懂)
这种方法先找到目标行业的文本元素,再向上追溯到所在行,最后提取对应列的数值:
from bs4 import BeautifulSoup # 你的HTML代码 html = """ <table class="sal-sector-exposure__sector-table"><thead><tr><th>Sectors</th> <th><span class="sal-sector-exposure__col-icon sal-sector-exposure__col-icon--fund"></span> <span class="sal-sector-exposure__col-title">Fund</span> <span class="sal-sector-exposure__col-pct">%</span></th> <!----> <th><span class="sal-sector-exposure__col-icon sal-sector-exposure__col-icon--benchmark"></span> <span class="sal-sector-exposure__col-title sal-sector-exposure__col-title--long">Category</span> <span class="sal-sector-exposure__col-title sal-sector-exposure__col-title--short">Cat</span> <span class="sal-sector-exposure__col-pct">%</span></th></tr></thead> <tbody><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-basic-materials"></i></span> <span>Basic Materials</span></td> <td><span>5.46</span></td> <!----> <td><span>4.60</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-consumer-cyclical"></i></span> <span>Consumer Cyclical</span></td> <td><span>11.95</span></td> <!----> <td><span>12.04</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-financial-services"></i></span> <span>Financial Services</span></td> <td><span>17.97</span></td> <!----> <td><span>15.44</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-real-estate"></i></span> <span>Real Estate</span></td> <td><span>1.86</span></td> <!----> <td><span>5.16</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-communication-services"></i></span> <span>Communication Services</span></td> <td><span>8.61</span></td> <!----> <td><span>9.22</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-energy"></i></span> <span>Energy</span></td> <td><span>4.15</span></td> <!----> <td><span>3.14</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-industrials"></i></span> <span>Industrials</span></td> <td><span>12.08</span></td> <!----> <td><span>10.62</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-technology"></i></span> <span>Technology</span></td> <td><span>18.32</span></td> <!----> <td><span>19.33</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-consumer-defensive"></i></span> <span>Consumer Defensive</span></td> <td><span>5.25</span></td> <!----> <td><span>5.96</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-healthcare"></i></span> <span>Healthcare</span></td> <td><span>12.38</span></td> <!----> <td><span>12.03</span></td></tr><tr><td><span class="sal-sector-exposure__sector"><i class="ms ms-sector-utilities"></i></span> <span>Utilities</span></td> <td><span>1.96</span></td> <!----> <td><span>2.45</span></td></tr></tbody></table> """ soup = BeautifulSoup(html, 'html.parser') # 1. 找到包含"Consumer Cyclical"的span元素 sector_span = soup.find('span', string='Consumer Cyclical') # 2. 向上找到该行的<tr>标签 sector_row = sector_span.find_parent('tr') # 3. 取该行的第二个<td>(索引为1,因为从0开始计数),再提取里面span的文本 fund_value = sector_row.find_all('td')[1].span.text print(fund_value) # 输出:11.95
方法二:用CSS选择器直接定位(简洁高效)
如果你的BeautifulSoup版本是4.7.0及以上,可以用更简洁的CSS选择器一次性定位到目标元素,适合熟悉CSS选择器的开发者:
# 用CSS选择器:找到表格中包含Consumer Cyclical的行,再取第二个td里的span fund_value = soup.select_one('table.sal-sector-exposure__sector-table tr:has(span:contains("Consumer Cyclical")) td:nth-of-type(2) span').text print(fund_value) # 输出:11.95
注意事项
- 方法二中的
:has()和:contains()选择器需要BeautifulSoup 4.7.0或更高版本支持,如果你的版本较低,建议使用方法一。 - 两种方法都能精准定位到目标数值,你可以根据自己的习惯和环境选择。
内容的提问来源于stack exchange,提问作者Roy Lee
相关产品推荐
相关产品推荐

