如何抓取使用frameset框架的老式政府网站数据
解决Frameset框架页面的数据抓取问题
方法一:直接请求子页面URL
从你用requests获取的主页面源码能看到,目标内容所在的frame的src是Lake_ElecSumm_all.htm,这是相对路径,需和主页面URL拼接成完整地址:https://lakecounty.in.gov/departments/voters/election-results-c/2022GeneralElectionResults/Lake_ElecSumm_all.htm
可以直接用requests+BeautifulSoup抓取这个子页面:
import requests from bs4 import BeautifulSoup sub_url = "https://lakecounty.in.gov/departments/voters/election-results-c/2022GeneralElectionResults/Lake_ElecSumm_all.htm" response = requests.get(sub_url) response.encoding = 'iso-8859-1' # 匹配页面指定的编码 soup = BeautifulSoup(response.text, 'html.parser') # 按需提取数据,示例:打印页面文本内容 print(soup.get_text())
方法二:修正Splinter/Selenium代码,切换到Frame上下文
你之前的代码仅定位了frame元素,但未切换到frame的上下文,因此无法获取内部内容。需要先切换到目标frame,再进行内容抓取:
from splinter import Browser import time url = "https://lakecounty.in.gov/departments/voters/election-results-c/2022GeneralElectionResults/index.htm" browser = Browser('chrome') # 替换为你使用的浏览器驱动 browser.visit(url) time.sleep(2) # 等待页面加载完成 # 方式1:通过frame的name属性切换(页面中该frame的name为'reports') browser.driver.switch_to.frame('reports') # 方式2:通过xpath定位frame后切换(可选) # frame_element = browser.find_by_xpath('/html/frameset/frameset/frame[2]').first # browser.driver.switch_to.frame(frame_element._element) # 现在可获取frame内的内容 print(browser.html) # 若后续需操作主页面,切回主上下文 browser.driver.switch_to.default_content() browser.quit()
之前方法无效的原因
- requests/BeautifulSoup:主页面仅为frameset框架布局,实际数据存储在独立的子页面中,直接请求主页面只能拿到框架结构,无法获取子页面内容。
- Splinter/Selenium:未切换到frame的上下文,代码始终操作主页面DOM,自然无法读取frame内部的元素文本。
内容的提问来源于stack exchange,提问作者Zaynaib Giwa
相关产品推荐
相关产品推荐

