如何使用Beautiful Soup选取指定网页表格?
解决:抓取维基百科2020美国大选各州结果表格
你的代码存在两个核心问题,导致只能抓到页面上方的表格:
- 仅获取第一个匹配表格:
soup.find()只会返回页面中第一个符合wikitable sortable类的表格,也就是你提到的“Joe Biden vs Donald Trump”表格,而非目标的“Results by State”表格。 - 遍历逻辑错误:
find()返回单个表格对象,此时for table in tables会遍历该表格的子标签,而非多个表格,完全偏离筛选目标。
修正方案一:通过章节定位精准抓取
直接定位到“Results by state”对应的章节区域,再提取其中的表格,是最可靠的方式:
import requests from bs4 import BeautifulSoup website = 'https://en.wikipedia.org/wiki/2020_United_States_presidential_election' result = requests.get(website) content = result.text soup = BeautifulSoup(content, "html.parser") # 定位到"Results by state"章节 results_section = soup.find(id="Results_by_state") # 获取该章节下的目标表格 target_table = results_section.find_next("table", class_="wikitable sortable") # 提取表头 headers = [header.text.strip() for header in target_table.find_all('th')] # 提取表格行数据(跳过表头行,过滤空行) rows = [] for row in target_table.find_all('tr')[1:]: td_elements = row.find_all('td') row_data = [elem.text.strip() for elem in td_elements] if row_data: rows.append(row_data) # 测试输出 print("表头:", headers) print("前两行数据:", rows[:2])
修正方案二:遍历表格筛选目标
如果担心章节ID变动,也可以遍历所有符合类的表格,通过表格标题筛选:
import requests from bs4 import BeautifulSoup website = 'https://en.wikipedia.org/wiki/2020_United_States_presidential_election' result = requests.get(website) content = result.text soup = BeautifulSoup(content, "html.parser") # 获取所有符合样式的表格 tables = soup.find_all("table", class_="wikitable sortable") target_table = None for table in tables: # 通过表格标题筛选目标 caption = table.find('caption') if caption and "Results by state or territory" in caption.text: target_table = table break if target_table: headers = [header.text.strip() for header in target_table.find_all('th')] rows = [] for row in target_table.find_all('tr')[1:]: td_elements = row.find_all('td') row_data = [elem.text.strip() for elem in td_elements] if row_data: rows.append(row_data) print(headers) print(rows[:2]) else: print("未找到目标表格")
内容的提问来源于stack exchange,提问作者trog12
相关产品推荐
相关产品推荐

