Python爬取气象网站温度数据异常及解析器选型咨询
问题修复:提取目标站点温度数据
你的代码直接匹配class="col-md-9"的div标签,该标签是页面右侧全部预报内容的父容器,内部嵌套了所有预报相关的表格、文本、提示信息,因此会返回全量内容而非单独温度数据,直接指定索引无效是因为选中的对象本身就是外层父容器,没有缩小定位范围到温度所在的具体节点。
正确提取逻辑是先定位到核心预报表格,再匹配温度对应的列,参考可运行代码如下:
import requests from bs4 import BeautifulSoup as bs url = "http://kktcmeteor.org/tahminler/merkezler?m=ISKELE" # 增加请求头模拟普通浏览器访问,避免被站点反爬规则拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } r = requests.get(url, headers=headers) r.encoding = "utf-8" # 手动指定编码,避免土耳其语特殊字符乱码 cast = bs(r.content, "lxml") # 定位到存放预报数据的具体表格,而非整个内容容器 forecast_table = cast.find("table", class_="table table-striped") temp_result = [] if forecast_table: # 跳过表头行,遍历所有数据行 rows = forecast_table.find_all("tr")[1:] for row in rows: cols = row.find_all("td") if len(cols) >= 3: # 第三列对应当地语言标注的温度列,索引稳定不会随页面样式调整偏移 forecast_date = cols[0].text.strip() temperature = cols[2].text.strip() temp_result.append((forecast_date, temperature)) # 打印输出多日预报温度 for date, temp in temp_result: print(f"预报日期:{date},温度:{temp}") # 如需提取页面顶部的实时温度,可使用以下逻辑 realtime_temp = cast.find("strong", string=lambda t: "°C" in t if t else False).text.strip() print(f"当前实时温度:{realtime_temp}")
lxml与html.parser解析器差异及选型规则
两者都是BeautifulSoup支持的HTML解析器,核心差异如下:
- 性能差异:lxml基于C语言实现,解析速度远高于纯Python实现的html.parser,待解析的页面DOM结构越复杂、内容量越大,性能差距越显著。
- 容错能力:lxml对非规范HTML的兼容性更强,遇到标签未闭合、嵌套错误、属性缺失等问题时会自动修正DOM结构,解析结果更稳定;html.parser容错能力较弱,解析结构混乱的页面时容易出现节点丢失、层级错位的问题。
- 依赖要求:html.parser是Python标准库内置组件,安装Python和BeautifulSoup后即可直接使用,无需额外安装依赖;lxml是第三方库,需要单独执行
pip install lxml完成安装,在部分无外网权限、受限的运行环境中可能无法部署。 - 功能差异:lxml同时支持HTML、XML两种格式解析,原生支持XPath语法做节点筛选,复杂提取场景下开发效率更高;html.parser仅支持HTML解析,只能使用BeautifulSoup原生的find/find_all等方法做节点匹配。
选型判断依据:
日常爬虫开发优先选择lxml,解析速度快、容错性好,适配绝大多数页面场景;如果运行环境无法安装第三方依赖,且待解析的页面是结构完全规范的标准HTML,可选择html.parser,无需额外配置更轻便。
内容的提问来源于stack exchange,提问作者Erdem_Ayhan
相关产品推荐
相关产品推荐

