从HTML表格抓取新冠数据:如何去除结果中的大洲字段
解决Web Scraper抓取新冠数据时排除大洲信息的问题
嘿,作为Web Scraping新手能写到这一步已经很棒啦!针对你遇到的多余大洲数据问题,我来给你几个简单易懂的解决方案,都是基于你现有代码修改的:
方案1:通过样式排除隐藏的大洲单元格
观察你提供的HTML片段,大洲所在的<td>带有display:none样式,我们可以直接筛选掉这类单元格:
import requests from bs4 import BeautifulSoup url = "https://www.worldometers.info/coronavirus/" page = requests.get(url, verify=True) soup = BeautifulSoup(page.content, features="lxml") rows = soup.select("tr") for row in rows: # 只保留不包含 display:none 样式的td元素 cells = row.find_all("td", style=lambda val: val and "display:none" not in val) # 提取每个单元格的文本,同时去掉多余的空格和换行 row_data = [cell.get_text(strip=True) for cell in cells] # 跳过空行(比如表格里的分隔行) if any(row_data): print(row_data)
这个方法的好处是精准匹配隐藏的元素,不会误删其他有效数据。
方案2:直接排除最后一个单元格
从HTML结构来看,大洲信息总是每个<tr>的最后一个<td>,我们可以直接截取前N个单元格:
import requests from bs4 import BeautifulSoup url = "https://www.worldometers.info/coronavirus/" page = requests.get(url, verify=True) soup = BeautifulSoup(page.content, features="lxml") rows = soup.select("tr") for row in rows: cells = row.find_all("td") # 排除最后一个td(也就是大洲所在的单元格) if cells: relevant_cells = cells[:-1] row_data = [cell.get_text(strip=True) for cell in relevant_cells] if any(row_data): print(row_data)
这个方法更简单直接,适合结构稳定的表格,但如果网站后续调整了列顺序,可能需要修改代码。
方案3:通过自定义属性排除大洲单元格
那个大洲<td>带有data-continent属性,我们可以利用这个属性来精准排除:
import requests from bs4 import BeautifulSoup url = "https://www.worldometers.info/coronavirus/" page = requests.get(url, verify=True) soup = BeautifulSoup(page.content, features="lxml") rows = soup.select("tr") for row in rows: # 只保留没有 data-continent 属性的td元素 cells = row.find_all("td", attrs={"data-continent": False}) row_data = [cell.get_text(strip=True) for cell in cells] if any(row_data): print(row_data)
这个方法是最可靠的,因为网站很少会随意修改自定义属性,即使样式或列顺序变了,只要这个属性存在就能生效。
新手小提示
get_text(strip=True):帮你去掉文本前后的空格、换行符,让数据更整洁;if any(row_data):过滤掉表格里的空行(比如表头之间的分隔行);- 如果想把数据保存成CSV文件,可以配合Python的
csv模块,把收集到的row_data写入文件,方便后续做数据可视化。
内容的提问来源于stack exchange,提问作者user10482454
相关产品推荐
相关产品推荐

