博客备份小工具3「建议收藏」

博客备份小工具3「建议收藏」接着博客转发小工具2,又弄了一个第三版。主要功能有:博客备份到本地、浏览备份到本地的博客、关键字搜索本地的博客和转发博客可以选择个人分类填写Tag标签。其实想了想,转发博客干嘛非要在本地客户端转发,

大家好,又见面了,我是你们的朋友全栈君。

    接着 博客转发小工具2 ,又弄了一个第三版。主要功能有:博客备份到本地、浏览备份到本地的博客、关键字搜索本地的博客和转发博客可以选择个人分类 填写Tag标签。其实想了想,转发博客干嘛非要在本地客户端转发,直接在博客园的页面用js不就可以达到目的么。想是这么想,还没尝试。等我写完了这个博客就去试试。。继续回到这个小工具,说实在的本人做的这个小工具界面丑的那是、、反正就是很丑很丑啦。没办法,没有美工的那种艺术细胞。还有就是,整个功能其实真没什么技术含量,还是html的抓取,winfrom在工作中也没用过,就平时偶尔玩玩,望大神们勿喷~~。  

    不过我觉得这个小工具的作用:第一、可以用来备注自己的博客,自己留个底。第二、某些朋友的工作环境可能没有外网(我以前的公司就没有),这样的话可以用来备份一些博友的系类文章当资料。【要是可以的话,把系类文章导成dpf文档那就更爽了。可是我一直没成功~】。

    也许有写人会说:啥啥啥的早就有类似的软件了。我不知道,我没用过,我觉得自己做的用着开心。就当练手吧。

   开始说内容了。

博客备份小工具3「建议收藏」

 

博客备份小工具3「建议收藏」

功能一:备份博客到本地

备份的博客是博客园推荐的前150个。也可以自己手动输入要备份的url。

1.加载推荐博客

var docment = new HtmlAgilityPack.HtmlDocument();
docment.LoadHtml(BlogCommon.PostReqest(BlogUrlString.推荐博客url));
var nodes = docment.DocumentNode.SelectNodes("//ul//a");
List<object> list = new List<object>();
for (int i = 0; i < nodes.Count; i++)
{
    var url = "http://www.cnblogs.com" + nodes[i].Attributes["href"].Value;
    var name = "NO." + (i + 1).ToString() + " " + nodes[i].InnerText;
    list.Add(new { url = url, name = name });
}
list_tuijian.DataSource = list;
list_tuijian.ValueMember = "url";
list_tuijian.DisplayMember = "name";

 

2.加载随笔分类、档案和标签

 首先选中博客改变url,然后url文本框的TextChanged事件里面加载 随笔分类、档案和标签数据。

var docment = new HtmlAgilityPack.HtmlDocument();
docment.LoadHtml(BlogCommon.GetRequest(BlogUrlString.个人博客分类url(strname)));
//加载随笔类型
LoadTree(docment, "//div[@class='catListPostCategory']//a", tree_suibiType, "随笔分类");
tree_suibiType.CheckBoxes = true;

// 加载随笔档案
LoadTree(docment, "//div[@class='catListPostArchive']//a", tree_suibiTime, "随笔档案");
tree_suibiTime.CheckBoxes = true;

//// 加载文章类型
//LoadTree(docment, "//div[@class='catListArticleCategory']//a", tree_wenzhangType, "文章类型");
//tree_suibiType.CheckBoxes = true;

docment.LoadHtml(BlogCommon.GetRequest(BlogUrlString.标签url(strname)));
// 加载文章类型
LoadTree(docment, "//div[@id='taglist']//a", tree_tag, "标签");
tree_tag.CheckBoxes = true;

 

public void LoadTree(HtmlAgilityPack.HtmlDocument docment, string where, TreeView trre, string TreeName)
{
    try
    {
        trre.Nodes.Clear();
        var nodes = docment.DocumentNode.SelectNodes(where);
        if (nodes == null || nodes.Count <= 0)
            return;
        List<object> list = new List<object>();

        TreeNode treenodeS = new TreeNode() { Name = "", Text = TreeName };
        for (int i = 0; i < nodes.Count; i++)
        {
            TreeNode treenode = new TreeNode();
            var url = nodes[i].Attributes["href"].Value;
            var name = nodes[i].InnerText;
            list.Add(new { url = url, name = name });
            treenode.Text = name;
            treenode.Name = url;
            treenodeS.Nodes.Add(treenode);
        }
        trre.Nodes.Add(treenodeS);
        trre.ExpandAll();//展开节点
    }
    catch (Exception ex)
    {
        MessageBox.Show("加载" + TreeName + "错误" + ex.Message);
    }
}

 

3.点击备份

点击备份,读取选中的复选框所包含的所有url。

#region 获取某个选中树节点 的所有url地址

        public List<string[]> getShuibiType_all_url(string url, ref List<string[]> list_urlS)
        {
            label1.Text = "正在读取" + url;
            var docment = new HtmlAgilityPack.HtmlDocument();
            docment.LoadHtml(BlogCommon.GetRequest(url));
            // a class entrylistItemTitle  entrylistTitle
            var nodes = docment.DocumentNode.SelectNodes("//div[@class='entrylist']//div[@class='entrylistPosttitle']//a");
            if (nodes == null)
                nodes = docment.DocumentNode.SelectNodes("//div[@id='content']//div[@class='post post-list-item']/h2/a");
            var entrylistTitle = docment.DocumentNode.SelectNodes("//h1[@class='entrylistTitle']");
            if (entrylistTitle == null)
                entrylistTitle = docment.DocumentNode.SelectNodes("//div[@id='content']/h2");
            var posts_title = entrylistTitle != null ? entrylistTitle[0].InnerText : "未分类";
            if (nodes != null && nodes.Count > 0)
            {
                for (int j = 0; j < nodes.Count; j++)
                {
                    label1.Text = "正在读取[" + posts_title + "]" + (j + 1) + "/" + nodes.Count + "" + "url地址";

                    list_urlS.Add(
                        new string[] 
                        { 
                            nodes[j].Attributes["href"].Value,
                            nodes[j].InnerText,
                            entrylistTitle.Count>=1?entrylistTitle[0].InnerText:"未分类"
                        });
                }
            }
            return list_urlS;
        }

        #endregion

 

点击备份,保存到本地。

博客备份小工具3「建议收藏」
博客备份小工具3「建议收藏」

#region 保存内容到文件 /// <summary> /// 保存内容到文件 /// </summary> /// <param name="list_str">根据地址集合</param> /// <param name="type"></param> /// <param name="docment"></param> public void SaveFile(List<string[]> list_str, string type, HtmlAgilityPack.HtmlDocument docment) { if (list_str == null || list_str.Count <= 0) return; for (int i = 0; i < list_str.Count; i++) { var url = list_str[i][0]; var name = url.Split('/').Length >= 4 ? url.Split('/')[3] : "未分类"; if (list_str[i].Length == 3) { try { label1.Text = "正在请求[" + name + "/" + type + "]页面" + (i + 1) + "/" + list_str.Count + ""; #region 文件路径处理 //过滤文件名的特殊字符 string[] rep = new string[] { "&mdash;", ":", "<", ">", "?", "*", "/", "|", "\"" }; string fileNmae = list_str[i][1].Replace("\\", string.Empty); for (int j = 0; j < rep.Length; j++) { if (rep[j].Length == 0) continue; fileNmae = fileNmae.Replace(rep[j], string.Empty); } var Paht = ForwardPath + name + "\\" + type + "\\" + list_str[i][2] + "\\"; for (int j = 0; j < rep.Length; j++) { if (rep[j].Length == 0) continue; Paht = Paht.Replace(rep[j], string.Empty); } Paht = FileHelp.PathBlogs + Paht; var FilePath = Paht + fileNmae + ".html"; #endregion if (radioButton2.Checked && File.Exists(FilePath)) { label1.Text = "页面数据存在[" + name + "/" + type + "]页面" + (i + 1) + "/" + list_str.Count + ""; continue; } var html = BlogCommon.GetRequest(url); docment.LoadHtml(html); var Nodes = docment.DocumentNode.SelectNodes("//div[@class='postBody']"); if (Nodes == null) Nodes = docment.DocumentNode.SelectNodes("//div[@id='cnblogs_post_body']"); html = Nodes[0].InnerHtml; docment.DocumentNode.InnerHtml = "<div id='my_html_postBody'>" + html + "</div>"; #region 去掉a标签的超链接 //去掉a标签的超链接 var html_aS = docment.DocumentNode.SelectNodes("//a"); if (html_aS != null) for (int z = 0; z < html_aS.Count; z++) if (html_aS[z].Attributes["href"] != null && html_aS[z].Attributes["href"].Value[0] != '#') html_aS[z].Attributes["href"].Value = "javascript:void()"; #endregion  label1.Text = "准备保存[" + name + "/" + type + "]内容" + (i + 1) + "/" + list_str.Count + "~"; FileHelp.CreatePath(Paht + @"imgs\"); saveImg(docment, Paht + @"imgs\", label1.Text + "..."); docment.CreateAttribute("url", url); //profile_block  docment.DocumentNode.InnerHtml = "<div id='mytext_url'>" + url + "</div>" + "<div id='mytext_BlogTitleName'>" + name + "</div>" + docment.DocumentNode.InnerHtml; docment.Save(FilePath, Encoding.UTF8); File.SetCreationTime(FilePath, new DateTime(FileHelp.Ticks)); LuceneHelp.CreateIndexFilePath(FilePath); //FileHelps.SaveFile(Paht, fileNmae + ".txt", html); label1.Text = "保存成功" + (i + 1) + "/" + list_str.Count + ""; } catch (Exception ex) { string mess = url + "\r\n" + ex.Message + "\r\n" + ex.StackTrace + "\r\n\r\n"; string myPath = FileHelp.PathBlogs + ForwardPath + name + "\\" + type + "\\"; FileHelp.SaveFile(myPath, "err.txt", mess, false); } } else FileHelp.SaveFile(FileHelp.PathBlogs + ForwardPath + name + "\\" + type + "\\", "err.txt", "异常373位置", false); } } #endregion

View Code

 

功能二:浏览本地博客

1.递归加载目录下所以博客文件

(这个方法不行,如果文件多的话,会有点卡。以后要改成点击加载下层目录)

public TreeNodeCollection loadTree(string path, TreeNodeCollection treeS, bool isNe = true) { List<string[]> list = FileHelp.FileSystemInfo(path, "3"); string[] str = new string[] { "", "" }; if (list != null) { for (int i = 0, j = 0; i < list.Count; i++, j++) { if (list[i][0] == "imgs") { j--; continue; } TreeNode tree1 = new TreeNode() { Text = list[i][0] }; treeS.Add(tree1); loadTree(list[i][1], treeS[j].Nodes); } } return treeS; }

 

2.点击加载博客内容(这里使用到了webBrowser控件来显示博客内容)

 #region 点击tree树 加载对应内容 /// <summary> /// 点击tree树 加载对应内容 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard) { htmlPath = FileHelp.PathBlogs + Forward.ForwardPath + e.Node.FullPath; string html = FileHelp.GetFile(htmlPath); HtmlAgilityPack.HtmlDocument docment = new HtmlAgilityPack.HtmlDocument(); docment.LoadHtml(html); try { var text_html = docment.DocumentNode.SelectNodes("//div[@id='my_html_postBody']")[0].InnerHtml; var mytext_url = docment.DocumentNode.SelectNodes("//div[@id='mytext_url']")[0].InnerHtml; webBrowser1.DocumentText = text_html; text_url.Text = mytext_url; } catch (Exception) { } } } #endregion

功能三:本地浏览关键字搜索

搜索使用的Lucenne.net。这里面的水太深了。这里就使用到了点皮毛。这里给出一些资料地址

1.首先在备份的时候就需要创建搜索索引。

/// <summary> /// 创建索引 /// </summary> /// <param name="analyzer"></param> /// <param name="title"></param> /// <param name="content"></param> private static void AddIndex(IndexWriter writer, string title, string content, string filePath, string id, string mytext_BlogTitleName = "Blog", string ClickQuantity = "0") { try { // Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));  Document doc = new Document(); doc.Add(new Field("Title", title, Field.Store.YES, Field.Index.ANALYZED));//存储且索引 //doc.Add(new Field("Content", content, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));// Field.Store.YES, Field.Index.ANALYZED));//存储且索引 doc.Add(new Field("Content", content, Field.Store.YES, Field.Index.ANALYZED)); doc.Add(new Field("filePath", filePath, Field.Store.YES, Field.Index.NOT_ANALYZED));//存储且索引 doc.Add(new Field("BlogTitleName", mytext_BlogTitleName, Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.Add(new Field("id", id, Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.Add(new Field("ClickQuantity", ClickQuantity, Field.Store.YES, Field.Index.NOT_ANALYZED)); //防止重复索引 writer.DeleteDocuments(new Term("id", id)); //AddTime  writer.AddDocument(doc); } catch (FileNotFoundException fnfe) { throw fnfe; } catch (Exception ex) { throw ex; } }

 

2.点击搜索

#region 点击搜索 private void but_select_Click(object sender, EventArgs e) { new Thread(delegate() { try { lab_meg.Text = "正在搜索....."; var htm = ""; var list = LuceneHelp.SelectData(FileHelp.PathBlogs + "Index\\", txt_select.Text.Trim(), this.lab_meg); var count = 150; if (list.Count >= count) { var mess = MessageBox.Show("搜索结果过多,是否只显示前" + count + "条~", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk); if (mess == System.Windows.Forms.DialogResult.Yes) { int index = 0; foreach (var item in list) { index++; htm += "<a name='click_load_file' href='#' filePath='" + item.FilePath + "'>" + item.FileName + "</a><br/><div>" + item.Content + "<div><br/><div style='width:100%;text-align:right;'><span style='margin-right:20px;background-color:#e1d2d2'>作者[" + item.BlogTitleName + "]&nbsp;&nbsp;搜索(" + item.ClickQuantity + ")</span></div><br/><br/>"; if (index >= count) break; } } else foreach (var item in list) { htm += "<a name='click_load_file' href='#' filePath='" + item.FilePath + "'>" + item.FileName + "</a><br/><div>" + item.Content + "<div><br/><div style='width:100%;text-align:right;'><span style='margin-right:20px;background-color:#e1d2d2'>作者[" + item.BlogTitleName + "]&nbsp;&nbsp;搜索(" + item.ClickQuantity + ")</span></div><br/><br/>"; } } else { foreach (var item in list) { htm += "<a name='click_load_file' href='#' filePath='" + item.FilePath + "'>" + item.FileName + "</a><br/><div>" + item.Content + "<div><br/><div style='width:100%;text-align:right;'><span style='margin-right:20px;background-color:#e1d2d2'>作者[" + item.BlogTitleName + "]&nbsp;&nbsp;搜索(" + item.ClickQuantity + ")</span></div><br/><br/>"; } } webBrowser1.DocumentText = htm; htmlList = htm; } catch (Exception ex) { //MessageBox.Show(ex.Message); lab_meg.Text = "搜索出错~" + ex.Message; } }).Start(); } #endregion

 

下载地址:

环境:vs2013 版本:.Net Framework4.5 数据库:无 

程序下载 源码下载  (源码都给您了,顺手点个赞呗~~)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155060.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • pve虚拟机单网口(虚拟机做软路由)

    PVE虚拟网口扩展实现一线多拨PVE网口设置可以看到这里有两个物理网口我的物理网口enp3s0没有对应的vmbr1,需要先创建LinuxBridge,步骤如下:ROS虚拟网口设置这是关键一步,需要创建四个虚拟网口对应一个LAN口设置四个虚拟网口,完成如下:完成!…

  • tensorflow2.0 cnn(layerwise)

    实验环境:tensorflow版本1.2.0,python2.7介绍depthwise_conv2d来源于深度可分离卷积:Xception:DeepLearningwithDepthwiseSeparableConvolutionstf.nn.depthwise_conv2d(input,filter,strides,padding,rate=None,name=None,data_fo

  • vb.net listview_不VB思考VB数据表

    vb.net listview_不VB思考VB数据表控件:TEXTBOX   :1个     Name:txtJobNoBUTTON:    2个      Name:btnFilter,btnShowAllLISTVIEW: 1个      Name:lstvwJobNo Columns:JobNo,ContainerID,CartonID,PO,Style,Color,Size,ShipMent,Factory        

  • HTML5实战与剖析之HTMLDocument变化(readyreState属性、兼容模式和head属性)「建议收藏」

    HTML5实战与剖析之HTMLDocument变化(readyreState属性、兼容模式和head属性)「建议收藏」之前为大家介绍了些许关于HTML5新添加的小东东,想必大家也有所了解了。今天为大家介绍HTML5中有关HTMLDocument方面新添加的内容。那么HTML5中有关HTMLDocument方面新添加的内容都有什么呢?HTML5中有关HTMLDocument方面新添加的内容有readyState属性、兼容模式判断和head属性。下面就为大家一一介绍这些新添加的小东东吧。

  • tomcat7官网下载

    tomcat7官网下载1.官网地址:tomcat.apache.org,进入后点击Tomcat72.选择不同的类型,以“64-bitWindowszip”为例3.保存文件,确定4.解压后,进入bin目录,双击startup.bat,出现下图5.打开浏览器,输入127.0.0.1:8080,出现下图,安装成功转载于:https://my.oschina.net/u/4052883/blog/29915522…

  • solid原则应用实例_设计模式solid原则

    solid原则应用实例_设计模式solid原则在面向对象编程中,SOLID是5个重要的设计原则的缩写。首先是由著名的软件大师RobertC.Martin(Bob大叔)在DesignPrinciplesandDesignPatterns中提出,后来MichaelFeathers用SOLID来概括这五大原则。SOLID原则使得软件设计更加容易理解、灵活和可维护。作为一名软件工程师,这5个原则我们必须知道。本文,我将涵盖这些原则,并举例说明怎样是违背了原则,以及如何进行纠正来符合SOLID原则。S—Singlerespons

    2022年10月27日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号