[asp.net] 获取网页中img标签,然后在页面上显示

首先很无聊,想提升自己水平,所以就写了微笑

    1、vs2017创建了个mvc webapi  框架.net framework4.5

                添加一个api控制器,名字随便起的(我喜欢用帕斯卡命名法 即pascal命名法

        2、然后创建如下方法,实话说多半是网上直接复制,然后组装下(我是在本机上试)

using Common.NetJson;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Http;
using System.Xml;

namespace Reptilian.Controllers
{
    public class GetImagesController : ApiController
    {
        public IEnumerable<string> Get()//解决跨域问题
        {
            return new string[] { "value1", "value2" };
        }

        public string Images(string Key)
        {
            if (Key=="kaishi")
            {
                if (Str().Length>5)
                {
                    JsonResult json = new JsonResult();
                    Random ram = new Random();
                    Dictionary<int, string> dic = new Dictionary<int, string>();
                    for (int i = 0; i < 5; i++)
                    {
                        dic[i] = Str()[ram.Next(Str().Length - 1)];
                    }
                    json.rows = dic;
                    json.success = true;
                    json.total = Str().Length;
                    return JsonConvert.SerializeObject(json);
                }
            }
            return "nothing to you";
        }
        private string[] Str()
        {
            string pageHtml = string.Empty;
            string url = "http://photo.sina.com.cn/";
            StringBuilder sb = new StringBuilder();
            WebClient MyWebClient = new WebClient();
            MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
            Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据
                                                             //string pageHtml = Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句            
            pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句
            string regImg = @"(?is)<img\s+((?<key>[^=]+)=([""']?)(?<value>[^'""]+)\2\s*)+?\s*/?>([^<>]*?</img>)?";

            MatchCollection matches = Regex.Matches(pageHtml, regImg, RegexOptions.IgnoreCase);
            string[] imgs = new string[matches.Count];
            for (int i = 0; i < matches.Count; i++)
            {
                string Src = matches[i].ToString();
                if (!Src.Contains("/>"))//是否是闭合标签
                {
                    Src = Src.Replace(">", "/>");
                }
                XmlNodeList xnl = GetNoteList(Src, "//img");
                if (xnl.Count > 0 && !string.IsNullOrEmpty(xnl[0].Attributes["src"].Value))
                {
                    imgs[i] = xnl[0].Attributes["src"].Value;
                }
            }
            return imgs;
        }
        private XmlNodeList GetNoteList(string xmlText, string tag)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(new System.IO.MemoryStream(System.Text.Encoding.GetEncoding("UTF-8").GetBytes(xmlText)));
            return xDoc.SelectNodes(tag);
        }
    }
}

using System.Collections.Generic;

namespace Common.NetJson
{
    public class JsonResult
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <remarks>设置变量默认值</remarks>
        public JsonResult()
        {
            total = 0;
            success = false;
            msg = string.Empty;
            rows = new List<object>();
            children = new List<JsonResult>();
        }

        public JsonResult(string _id, string _text) { id = _id; text = _text; }
        public int total { get; set; }
        public bool success { set; get; }
        public string msg { get; set; }
        public object obj { set; get; }
        public object rows { set; get; }
        public string id { get; set; }
        public string text { get; set; }
        public List<JsonResult> children { get; set; }
    }

    /// <summary>
    /// datatables 表格插件返回JSON数据格式
    /// </summary>
    public class dtJson
    {
        public int draw { get; set; }
        public int recordsTotal { get; set; }
        public int recordsFiltered { get; set; }
        public object data { get; set; }
    }
}

        再解释下其中的重点吧。

                if (!Src.Contains("/>"))//是否是闭合标签
                {
                    Src = Src.Replace(">", "/>");
                }

                        html标签闭合有两种

                            1、<div></div>第一种

                            2、<img src="#" alt="Alternate Text" />第二中

                        如果

Src取出的img标签不是闭合标签,vs就会抛异常。

                        跨域问题

        public IEnumerable<string> Get()//解决跨域问题
        {
            return new string[] { "value1", "value2" };
        }
                        
                        为什么要写下面这方法
        public IEnumerable<string> Get()//解决跨域问题

                首先百度上说在web.cofing文件中加Access-Control-Allow-Origin :*,然而不管在IIs中加还是在web.cofing中加,发送的ajax请求都在报跨域请求什么什么  Access-Control-Allow-Origin 与什么 不匹配(null),的错。

                        好吧,我决定从vs创建web api给的例子中找原因。(我也不知道找没找到

                        

                        就跟着它写咯,艹,擦。之前百度一个说是什么,发送ajax请求时,浏览器会自动发送一个options什么东西。

                        难度还真这样?(待解!)

        3、写完上面的就开始测试了

                        先在postman上测试的

注意了:    我上面的WebApiConfig 是
                routeTemplate: "api/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}",

            所以访问的地址就是

                http://你的地址/Api/GetImages(控制器名)/Images(方法名)?Key=kaishi(值)            (Images方法没加[HttpGet]、或[HttpPost],默认post发送请求)

            4、页面上的浏览

                        我使用的是 流加载(layui,为什么用layui,因为我懒)
                
                    <div class="flow-default" id="LAY_demo1" style="overflow-y:auto;height:700px;">
                        容器
                    </div>
                        
    flow.load({
        elem: '#LAY_demo1' //流加载容器
        , scrollElem: '#LAY_demo1'
        , isAuto: true
        , mb:100
        , done: function (page, next) { //执行下一页的回调
            //数据插入
            setTimeout(function () {
                var lis = [];
                var Arry;
                if (images() != "") {
                    Arry = images();//艹、擦,同步,异步的问题
                    $.each(Arry, function (i, obj) {
                        lis.push('<div style="width:50%;height:200px;float:left;background:#fff;border:1px solid aqua;"><img style="width:50%;height:200px;" src="' + obj + '" alt="图片来至于http://photo.sina.com.cn/" /></div > ');
                    }); 
                } else {
                    for (var i = 0; i < 5; i++) {
                        lis.push('<div style="width:50%;height:200px;float:left;background:green;"></div > ');
                    }
                }
                //执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
                //pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
                next(lis.join(''), page < 10); //假设总页数为 10
            }, 500);
        }
    });
    function images() {
        var a = [];
        $.ajax({
            url: 'http://192.168.0.104:88/Api/GetImages/Images?Key=kaishi',
            dataType: "json",
            cache: false,
            data: {},
            type: "post",
            async: false,
            success: function (data) {
                try {
                    a = JSON.parse(data).rows;
                } catch (e) {
                    throw e;
                }
            }
        });
        return a;
    }
                重点,注意这里ajax发送请求使用 同步发送(等数据返回后再继续执行下去,不会的网页打debugger 调试),

效果是,
额,很丑,演示下,立马删,
睡觉,不懂的再问吧,反正我很菜在实习。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值