如何抓取含鼠标悬停事件且多数元素无class的网站表格数据
问题分析与解决方案
你遇到的核心问题是:BeautifulSoup的find_all()返回的是Tag对象的列表,而非直接的文本内容。直接打印这个列表只会输出对象引用,自然拿不到纯数值;而把列表转成字符串后,字符串没有.text方法,所以也无法提取文本。
修正思路
- 针对每个Tag对象,单独调用
.text属性提取内部文本,再用.strip()去除多余的换行、空格。 - 如果表格按行组织,建议按行遍历,确保每行的
time和flag数据对应,避免数据错位。
修正后的代码
按行提取(推荐,保证数据对应)
lists = soup.find_all('table', class_= "report") for table in lists: # 获取表格所有行 rows = table.find_all('tr') for row in rows: # 在当前行中查找对应列的Tag date_tag = row.find('td', class_="time") flag_tag = row.find('td', class_="flag") # 提取文本并处理空白,避免Tag不存在时报错 date = date_tag.text.strip() if date_tag else "" flag = flag_tag.text.strip() if flag_tag else "" info = [date, flag] print(info)
批量提取所有对应列
如果不需要按行配对,只是单纯收集所有time和flag的文本内容,可以用列表推导式:
lists = soup.find_all('table', class_= "report") for table in lists: # 遍历所有time列Tag,提取文本 dates = [tag.text.strip() for tag in table.find_all('td', class_="time")] # 遍历所有flag列Tag,提取文本 flags = [tag.text.strip() for tag in table.find_all('td', class_="flag")] info = list(zip(dates, flags)) # 可选:将对应位置的date和flag配对 print(info)
关键说明
- 不要直接打印
find_all()返回的列表,必须遍历列表中的每个Tag对象,调用.text获取文本。 .strip()用于去除文本前后的空白字符(换行、空格、制表符等),保证拿到干净的纯数值内容。- 加入
if date_tag else ""的判断,是为了避免某些行没有对应列时抛出AttributeError。
内容的提问来源于stack exchange,提问作者tracemuch
相关产品推荐
相关产品推荐

