使用BeautifulSoup抓取含随机span元素的表格并导出至Pandas的技术求助
解决表格中随机出现span元素的抓取问题
嘿,这种随机冒出来的span元素确实挺闹心的,不过咱们可以通过统一处理文本提取的方式绕开这个坑,轻松把干净的数据导入Pandas。下面给你两个实用的解决方案:
方案一:统一提取元素文本(最通用)
BeautifulSoup的get_text(strip=True)方法会自动提取当前标签下所有子元素的文本内容——不管里面有没有span、i这些嵌套标签,还能帮你去掉多余的空格和换行。直接用这个方法替代单纯取.text,就能完美解决随机span的干扰。
具体代码示例:
import requests from bs4 import BeautifulSoup import pandas as pd # 抓取目标页面 url = "https://to.sze.hu/kezdolap" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 定位你指定的目标表格 target_table = soup.select_one("#content > div:nth-child(2) > div > div > div > table") # 提取表头文本 headers = [th.get_text(strip=True) for th in target_table.find_all("th")] # 提取表格行数据 rows = [] for tr in target_table.find_all("tr")[1:]: # 跳过表头行 row_data = [td.get_text(strip=True) for td in tr.find_all("td")] if row_data: # 过滤空行 rows.append(row_data) # 转换为Pandas DataFrame df = pd.DataFrame(rows, columns=headers) print(df.head())
方案二:针对性处理span元素(如果需要保留特殊标识)
如果span里的内容是特殊标记(比如高亮、备注),需要单独处理的话,可以先判断td标签下是否存在span,再自定义逻辑提取内容:
# 替换上面的行数据提取部分 rows = [] for tr in target_table.find_all("tr")[1:]: row_data = [] for td in tr.find_all("td"): span = td.find("span") if span: # 这里可以自定义处理逻辑,比如把span文本单独标记 content = td.get_text(strip=True) # 或者写成 f"[{span.get_text(strip=True)}]{td.get_text(strip=True).replace(span.get_text(strip=True), '')}" else: content = td.get_text(strip=True) row_data.append(content) if row_data: rows.append(row_data)
这两种方法都能帮你避开随机span的影响,确保抓取到的是干净可用的文本数据,顺利导入Pandas进行后续分析处理。
内容的提问来源于stack exchange,提问作者bvlnt
相关产品推荐
相关产品推荐

