使用BeautifulSoup提取span标签数据时出现错误,如何提取指定百分比内容?
解决BeautifulSoup提取span文本的问题
看起来你遇到的问题主要是两点:一是没法获取所有目标数据,二是因为span标签里嵌套了子元素和注释,导致.string无法正确提取完整文本。咱们一步步来修正:
问题出在哪?
page_content.td只会获取第一个<td>标签,所以你只能拿到第一个百分比,没法获取第二个。content = page_content.td.contents得到的是td的子节点列表,你直接调用content.span.string是错误的——列表没有.span属性。就算你取列表里的元素(比如content[0].string),因为这个span里面还有子span(<span class="icon-Caret-down"></span>)和HTML注释,.string会返回None(只有当标签下只有一个文本节点时,.string才会返回文本)。
正确的提取代码
我们可以直接定位到带指定class的span标签,然后用.get_text()来提取所有文本内容(它会自动忽略子标签和注释,把所有文本拼接起来):
from bs4 import BeautifulSoup # 你的目标HTML html = '''<td style="text-align:right"><span class="sc-15yy2pl-0 hzgCfk"><span class="icon-Caret-down"></span>3.69<!-- -->%</span></td> <td style="text-align:right"><span class="sc-15yy2pl-0 hzgCfk"><span class="icon-Caret-down"></span>5.33<!-- -->%</span></td>''' page_content = BeautifulSoup(html, 'html.parser') # 找到所有带有目标class的span标签 target_spans = page_content.find_all('span', class_='sc-15yy2pl-0 hzgCfk') # 遍历提取文本 results = [] for span in target_spans: # get_text(strip=True)会自动去掉多余的空白字符 percentage = span.get_text(strip=True) results.append(percentage) print(results) # 输出: ['3.69%', '5.33%']
另一种思路:先找td再找span
如果你想先定位td标签再提取里面的span,也可以这么写:
tds = page_content.find_all('td', style='text-align:right') results = [] for td in tds: # 在每个td里找到目标span span = td.find('span', class_='sc-15yy2pl-0 hzgCfk') if span: results.append(span.get_text(strip=True)) print(results)
这样就能完美提取出你想要的3.69%和5.33%了。
内容的提问来源于stack exchange,提问作者Praveen Negi
相关产品推荐
相关产品推荐

