使用HtmlAgilityPack采集墨迹天气中的天气数据

news2025/5/18 14:01:33

需要解析对应的HTML源码:

<div class="left">
        <div class="wea_alert clearfix">
            <ul>
                                <li>
                    <a href = "https://tianqi.moji.com/aqi/china/jiangxi/hukou-county" >
                        < span class="level level_2">
                            <img src = "https://h5tq.moji.com/tianqi/assets/images/aqi/2.png" alt="88 良">
                        </span>
                        <em>88</em>
                    </a>
                </li>
                                            </ul>
        </div>
        <div class="wea_weather clearfix">
            <em>30</em>
            <span><img src = "https://h5tq.moji.com/tianqi/assets/images/weather/w1.png" alt="多云"></span>
            <b>多云</b>
            <strong class="info_uptime">今天17:04更新</strong>
        </div>
        <div class="wea_about clearfix">
            <span>湿度 50%</span>
            <em>南风3</em>
                    </div>
        <div class="wea_tips clearfix">
            <span>今日天气提示</span>
            <em>略微偏热,注意衣物变化。</em>
        </div>
    </div>
    <div class="right">
        <div class="wea_info_avator">
            <img src = "https://h5tq.moji.com/tianqi/assets//images/avator/icon/2.png" alt="墨迹天气 小墨哥">
            <div id = "windows_download" >
                < img src="https://h5tq.moji.com/tianqi/assets//images/icon/avator_windows.png" height="35" alt="Windows 下载">
                <a href = "http://download.moji001.com/mojiapp/windoz/MoWeatherInstall_1.8.1.1.exe" target="_blank">Windows 下载</a>
            </div>
        </div>
    </div>

接收数据的对象

public class MainInfos
    {
        /// <summary>
        /// 日期
        /// </summary>
        public string TodayDate { get; set; } = DateTime.Now.ToString("yyyy年MM月dd日");
        /// <summary>
        /// 温度
        /// </summary>
        public string  WenduStr { get; set; }
        /// <summary>
        /// 风向
        /// </summary>
        public string  FengsuStr { get; set; }
        /// <summary>
        ///气压
        /// </summary>
        public string  QiyaStr { get; set; }
        /// <summary>
        /// 湿度
        /// </summary>
        public string ShiduStr { get; set; }
        /// <summary>
        /// 降水
        /// </summary>
        public string JiangshuiStr { get; set; }
        /// <summary>
        ///空气指数
        /// </summary>
        public string KongqiZhishuStr { get; set; }
        /// <summary>
        /// 天气
        /// </summary>
        public string TianqiStr { get; set; }
        /// <summary>
        /// 更新时间
        /// </summary>
        public string GenxinShijianStr { get; set; }
        /// <summary>
        /// j今日提示
        /// </summary>
        public string JinriTishi { get; set; }
        /// <summary>
        /// 当前天气的图标地址
        /// </summary>
        public string ImagePath { get; set; }
      
    }

采集数据的方法:

 /// <summary>
    /// 读取天气数据
    /// </summary>
     public  static class ReadFromWeb
    {
        public static MainInfos GetFromUrl(string Url)
        {

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            try
            { 
                HtmlWeb web = new HtmlWeb();
                HtmlAgilityPack.HtmlDocument doc = web.Load(Url);
                HtmlNode rootnode = doc.DocumentNode;
                MainInfos ThisMainInfos = null;
                HtmlNodeCollection GetUrlInfoNodes = doc.DocumentNode.SelectNodes("//div[@class='wrap clearfix wea_info']");
                if (GetUrlInfoNodes != null)
                {
                    ThisMainInfos = new MainInfos();
                    HtmlNode ThisMainNode = GetUrlInfoNodes.FirstOrDefault();
                    string InnerStr = ThisMainNode.InnerHtml;
                    //截取出来进行数据分析重新创建一个操作
                    HtmlDocument DOCJiequ = new HtmlDocument();
                    DOCJiequ.LoadHtml(InnerStr);
                    ///获取空气指数
                    HtmlNodeCollection NodesKongqizhishu  = DOCJiequ.DocumentNode.SelectNodes("//div[@class='wea_alert clearfix']");
                    if (NodesKongqizhishu!=null && NodesKongqizhishu.Count >0 )
                    {
                        HtmlNode KongqiZhishuNode = NodesKongqizhishu[0];
                        ThisMainInfos.KongqiZhishuStr = KongqiZhishuNode.InnerText.Replace("\r\n","").Replace(" ","").Trim();
                    } 
                    ///获取天气温度 图标
                    HtmlNodeCollection NodesTianqiWendu = DOCJiequ.DocumentNode.SelectNodes("//div[@class='wea_weather clearfix']");
                    if (NodesTianqiWendu != null && NodesTianqiWendu.Count > 0)
                    {
                        HtmlNode ThisWenduNode = NodesTianqiWendu[0]; 
                        HtmlNodeCollection WenduShowNodes = ThisWenduNode.ChildNodes;
                        HtmlNode WenduCanshuNode = WenduShowNodes.Where(x => x.Name == "em").FirstOrDefault();//温度
                        if (WenduCanshuNode!=null )
                        {
                            ThisMainInfos.WenduStr = WenduCanshuNode.InnerText;
                        }
                        HtmlNode TianqiCanshuNode = WenduShowNodes.Where(x => x.Name == "b").FirstOrDefault();//天气
                        if (TianqiCanshuNode != null)
                        {
                            ThisMainInfos.TianqiStr = TianqiCanshuNode.InnerText;
                        }
                        HtmlNode TianqiTubiaoCanshuNode = WenduShowNodes.Where(x => x.Name == "span").FirstOrDefault();//天气图标
                        if (TianqiTubiaoCanshuNode != null)
                        {
                            HtmlNode TianqiImageCanshuNode = TianqiTubiaoCanshuNode.FirstChild;//获取image标签
                            ThisMainInfos.ImagePath =TianqiImageCanshuNode.GetAttributeValue("src",string.Empty);
                        }
                        HtmlNode GenxinShijianCanshuNode = WenduShowNodes.Where(x => x.Name == "strong").FirstOrDefault();//更新时间
                        if (GenxinShijianCanshuNode != null)
                        {
                            ThisMainInfos.GenxinShijianStr = GenxinShijianCanshuNode.InnerText;
                        } 
                    }
                    ///获取湿度 风力
                    HtmlNodeCollection NodesShiduFengli= DOCJiequ.DocumentNode.SelectNodes("//div[@class='wea_about clearfix']");
                    if (NodesShiduFengli!=null &&  NodesShiduFengli.Count > 0)
                    {
                        HtmlNode ThisShiduFenliNode = NodesShiduFengli[0];
                        HtmlNode ShiduNode = ThisShiduFenliNode.ChildNodes.Where(x=>x.Name == "span").FirstOrDefault() ;//湿度
                        if (ShiduNode != null)
                        {
                            ThisMainInfos.ShiduStr = ShiduNode.InnerText;
                        }
                        HtmlNode FenliNode = ThisShiduFenliNode.ChildNodes.Where(x => x.Name == "em").FirstOrDefault();//风力
                        if (FenliNode != null)
                        {
                            ThisMainInfos.FengsuStr = FenliNode.InnerText;
                        } 
                    }
                    ///获取今日提示
                    HtmlNodeCollection NodesJinritishi = DOCJiequ.DocumentNode.SelectNodes("//div[@class='wea_tips clearfix']");
                    if (NodesJinritishi != null && NodesJinritishi.Count > 0)
                    {
                        HtmlNode ThisJinriTishiNode = NodesJinritishi[0]; 
                        HtmlNode JinriTishiNode = ThisJinriTishiNode.ChildNodes.Where(x => x.Name == "em").FirstOrDefault();//今日提示
                        if (JinriTishiNode != null)
                        {
                            ThisMainInfos.JinriTishi = JinriTishiNode.InnerText;
                        } 
                    } 
                }
                return ThisMainInfos;

            }
            catch (WebException ex)
            {
                //连接失败
                return null;
            }
        }
    }

应用方法:

MainInfos ThisModel =  ReadFromWeb.GetFromUrl("https://tianqi.moji.com/weather/china/jiangxi/hukou-county");
            if (ThisModel!=null )
            {
                MainGrid.DataContext = ThisModel ;
            }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZTE 7551N 中兴小鲜60 远航60 努比亚小牛 解锁BL 刷机包 刷root 展讯 T760 bl

ZTE 7551N 中兴小鲜60 远航60 努比亚小牛 解锁BL 刷机包 刷root 3款机型是一个型号&#xff0c;包通用&#xff0c; ro.product.system.modelZTE 7551N ro.product.system.nameCN_P720S15 #################################### # from generate-common-build-props # Th…

信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)

个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的&#xff0c;做计算题要保持头脑清晰&#xff0c;认真读题把PV、…

产品经理入门(2)产品体验报告

产品体验报告大纲&#xff1a;重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结

C43-指针与数组

一 定义一个指针变量指向数组 1.途径一:指向数组首元素的地址 代码示例: #include <stdio.h> int main() {int arr[3]{2,4,5};int *p;p&arr[0];printf("该数组的首元素是:%d",*p);return 0; }成果展示: 报错与总结: 给指针变量赋值时,未在数组首元素前输…

UDP--DDR--SFP,FPGA实现之ddr读写控制模块

DDR读写控制模块实现介绍 由于该模块接口数量较多&#xff0c;为了详细说明模块实现&#xff0c;采用文字流程进行介绍 上级模块传输数据到来捕捉数据有效上升沿传输写指令&#xff0c;写有效&#xff0c;写指令成功被下一级模块缓存&#xff0c;进行写地址一次读写长度&…

云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)

在云应用/服务的 5 层架构里&#xff0c;数据库服务层稳坐第 4 把交椅&#xff0c;堪称其中的 “硬核担当”。它的复杂程度常常让人望而生畏&#xff0c;不少人都将它视为整个架构中的 “终极挑战”。 不过&#xff0c;也有人觉得可扩展存储系统才是最难啃的 “硬骨头”&#…

AI Agent | Coze 插件使用指南:从功能解析到实操步骤

一、前言 在人工智能技术飞速发展的今天&#xff0c;低代码开发模式正成为构建智能应用的主流趋势。对于希望快速搭建 AI Bot 的开发者和业务人员而言&#xff0c;coze作为一款强大的低代码 AI 开发平台&#xff0c;凭借其高度模块化的插件体系脱颖而出。这些插件就像搭建智能…

MK米客方德SD NAND:无人机存储的高效解决方案

在无人机技术迅猛发展的当下&#xff0c;飞控系统的数据记录对于飞行性能剖析、故障排查以及飞行安全保障极为关键。以往&#xff0c;SD 卡是飞控 LOG 记录常见的存储介质&#xff0c;但随着技术的革新&#xff0c;新的存储方案不断涌现。本文聚焦于以 ESP32 芯片为主控制器的无…

【vscode】解决vscode无法安装远程服务器插件问题,显示正在安装

文章目录 现状分析采用VSIX离线安装第一步&#xff1a;离线下载插件包第二步&#xff1a;把下载好的插件文件上传到远程服务器上第三步&#xff1a;在windows下打开vscode&#xff0c;并链接远端&#xff0c;进行安装 现状分析 vscode无法远程安装扩展插件&#xff0c;显示正在…

【Spring】Spring的请求处理

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。 目录 引言HTTP/HTTPS协议Spring Web与Spring Web MVCSpring WebFlux 自定义的TPC/IP协议FTP、S…

粒子群算法(PSO算法)

粒子群算法概述 1.粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的&#xff0c;它源于对鸟群捕食行为的研究。 2.基本核心是利用群体中的个体对信息的共享从而使得整…

LLM智能体新纪元:深入解析MCP与A2A协议,赋能智能自动化协作

LLM智能体&#xff08;LLM agents&#xff09;是能够自主行动以实现特定目标的AI系统。在实际应用中&#xff0c;智能体能够将用户请求拆解为多个步骤&#xff0c;利用知识库或API获取数据&#xff0c;最终整合出答案。这让智能体相比于传统独立聊天机器人拥有更强大的能力——…

SAP学习笔记 - 开发豆知识01 - CDS SDK命令出乱码 (cds init CAP-Test03 --add java)

1&#xff0c;现象 安装完VSCode以及各种需要的插件&#xff08;比如SAP CDS Language Support&#xff09;&#xff0c;就可以做CAP开发。 用这个命令创建Project&#xff1a;cds init CAP-Test03 --add java 然后出来一个乱码错误 adding java The derived package name c…

(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)

目录 前言&#xff1a; 源代码&#xff1a; product.h product.c fileio.h fileio.c main.c json_export.h json_export.c tasks.json idex.html script.js 相关步骤&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步…

进阶-数据结构部分:​​​​​​​2、常用排序算法

飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法&#xff0c;它们的优劣和适用场景如下&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;简单易懂&#xff0c;时间复杂度较高&…

25、DeepSeek-R1论文笔记

DeepSeek-R1论文笔记 1、研究背景与核心目标2、核心模型与技术路线3、蒸馏技术与小模型优化4、训练过程简介5、COT思维链&#xff08;Chain of Thought&#xff09;6、强化学习算法&#xff08;GRPO&#xff09;7、冷启动**1. 冷启动的目的****2. 冷启动的实现步骤****3. 冷启动…

LeetCode --- 156双周赛

题目列表 3541. 找到频率最高的元音和辅音 3542. 将所有元素变为 0 的最少操作次数 3543. K 条边路径的最大边权和 3544. 子树反转和 一、找到频率最高的元音和辅音 分别统计元音和辅音的出现次数最大值&#xff0c;然后相加即可&#xff0c;代码如下 // C class Solution {…

npm 报错 gyp verb `which` failed Error: not found: python2 解决方案

一、背景 npm 安装依赖报如下错&#xff1a; gyp verb check python checking for Python executable "python2" in the PATH gyp verb which failed Error: not found: python2 一眼看过去都觉得是Python环境问题&#xff0c;其实并不是你python环境问题&#xf…

初识Linux · IP协议· 下

目录 前言&#xff1a; 内网IP和公网IP 内网IP 公网IP 路由 前言&#xff1a; 前文我们介绍了IP协议的协议头&#xff0c;通过源码等方式我们理解了IP协议中的字段&#xff0c;比如8位协议&#xff0c;比如通过环回问题引出的8位最大生存时间&#xff0c;比如8位协议&…

JAVA的常见API文档(上)

游戏打包 注意API文档中的方法不需要记忆&#xff01;&#xff01; 了解之后如果需要可以查询API文档 对Math的方法总结&#xff1a; 运用刚学的Math方法加快代码的运行效率 可以减少循环次数 找规律&#xff1a; 发现因子有规律&#xff1a; 必定一个大于平方根&#xff0c;…