使用BeautifulSoup爬取韩国汇率表格返回空结果的问题求助
排查爬取韩国汇率数据无有效内容的原因及解决方案
可能的原因
- 数据动态加载:你用
requests.get获取的是页面初始静态HTML,而汇率表格数据大概率是通过JavaScript(比如AJAX请求)动态渲染到页面的,初始HTML里仅包含标题框架,没有实际汇率数据。 - 选择器稳定性差:你依赖的
#frm_SearchDate > div:nth-child(17) > table选择器,完全绑定了父元素下第17个div的位置。一旦页面结构发生变化(比如新增广告、弹窗元素),这个位置就会失效,导致选中的容器里只有标题文本。
验证与解决方法
1. 确认数据加载方式并针对性处理
打开浏览器开发者工具(F12),切换到Network标签后刷新页面:
- 若找到返回汇率数据的XHR/Fetch接口(通常是JSON格式),直接用
requests请求该接口获取数据,这比解析HTML高效得多。 - 若无独立数据接口,说明数据是前端JS渲染生成,需用Selenium模拟浏览器加载完整页面:
from selenium import webdriver from bs4 import BeautifulSoup import time url = "http://www.smbs.biz/ExRate/StdExRate.jsp" driver = webdriver.Chrome() # 需提前安装对应版本的ChromeDriver driver.get(url) time.sleep(2) # 等待页面渲染完成 soup = BeautifulSoup(driver.page_source, 'html.parser') # 改用基于内容的稳定选择器定位表格 table = soup.find('table', text=lambda t: t and '일별 매매기준율' in t) print(table.text.strip()) driver.quit()
2. 优化选择器
放弃依赖元素位置的nth-child选择器,改用更可靠的标识:
- 通过表格标题文本定位:
soup.find('table', text=lambda t: t and '일별 매매기준율' in t) - 查看表格父元素的特定class/id(比如检查页面HTML中表格所在div的class属性),用类选择器定位:
soup.select_one('.rate-table-wrap table')(示例类名需根据实际页面调整)
3. 模拟浏览器请求(可选)
若网站有基础反爬,可添加请求头模拟浏览器访问,避免被识别为爬虫:
import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } url = "http://www.smbs.biz/ExRate/StdExRate.jsp" html = requests.get(url, headers=headers, verify=False).text soup = BeautifulSoup(html, 'html.parser')
内容的提问来源于stack exchange,提问作者jtoyhh
相关产品推荐
相关产品推荐

