专栏首页ccylovehs网络爬虫之html2md

网络爬虫之html2md

前言

上周利用java爬取的网络文章,一直未能利用java实现html转化md,整整一周时间才得以解决。

虽然本人的博客文章数量不多,但是绝不齿于手动转换,毕竟手动转换浪费时间,把那些时间用来做些别的也是好的。

设计思路

Java实现

一开始的思路是想着用java来解析html,想着各种标签解析、符号解析、正则替换等等,决定在github上搜索一波,果然是有前辈实现过,顿时欣喜若狂;

代码地址

下载后如下图

可利用htmlToHexoMd方法测试运行

可能作者是在linux服务器上定义的路径,我测试的时候一直提示路径问题,结果被迫更改转化的路径代码,

调试运行后生成的md文件,本地启动hexo服务,上传刚刚生成md文件,网页浏览,不满,弃之。

NodeJS实现

为何突然会选择NodeJS来实现,刚好最近在看node书籍,里面有提到node爬虫,解析爬取的内容,书中提到利用cheerio模块,遂果断浏览其api文档,cheerio其实就是jquery的翻版,这下可方便了,心中大喜。

实现思路

实现单个转化

自定义解析

实现批量转化

难点分析

自定义解析是比较头疼的事情,必须要分析需要转化的html的格式,需要读取的内容,本人对h1,h2,h3,div,img,a标签做了处理,可自行扩展

html解析代码如下

       if('p' === name){
                if(e_children.type === 'text'){
                    if(e.children.length > 1){
                        for(var j=0,c_len=e.children.length;j<c_len;j++){
                            if(e.children[j]['name'] === 'a') writeData = writeData + '('+e.children[j].attribs.href + ')\r\n';
                            else if(e.children[j]['type'] === 'text') writeData = writeData + e.children[j].data + '\r\n';
                        }
                    }else writeData = writeData + e.children[0].data + '\r\n';
                }else if(e_children.name === 'img') writeData = writeData + '![Image]('+e.children[0].attribs.src + ')\r\n';
            }else if('div' === name){
                var codes = $('#cnblogs_post_body .cnblogs_code pre').eq(code_idx++).text();
                codes = codes.replace(/^(\s*)\d+/gm, ' ');
                writeData = writeData + '```bash\r\n' + codes + '\r\n```\r\n';
            }else if('h1' === name) writeData = writeData + '# ' + e_children.data + '\r\n';
            else if('h2' === name) writeData = writeData + '## ' + e_children.data + '\r\n';
            else if('h3' === name) writeData = writeData + '### ' + e_children.data + '\r\n';

结语

完整代码请移步至本人的github,如果此文章对您有用请不吝star

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 原生js格式化json工具

    Jack Chen
  • windows开机提示文件损坏

    心情果断灰暗下来,按照提示一步步操作,点enter进入高级选项,试过了安全模式启动、最后一次正确配置启动、带命令提示符的安全模式启动都在读取驱动文件amdxat...

    Jack Chen
  • 前端性能优化之 JavaScript

    本文为 《JavaScript》 读书笔记,是利用中午休息时间、下班时间以及周末整理出来的,此书虽有点老旧,但谈论的性能优化话题是每位同学必须理解和掌握的,业务...

    Jack Chen
  • 利用模式进行构建——预分配模式

    MongoDB最明显的优势之一就是文档数据模型。它在模式设计和开发周期中均提供了很大的灵活性。用MongoDB文档可以很容易地处理那些不知道之后会需要哪些字段的...

    MongoDB中文社区
  • Python练手例子(13)

    76、编写一个函数,当输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n。

    py3study
  • 春招苦短,我用百道Python面试题备战

    在这个项目中,作者 kenwoodjw 准备了近 300 道 Python 面试题,同时还包含解决方案与代码。作者主要从 Python 基础、高级语句、网页应用...

    机器之心
  • @Autowired和@Resource的区别

    历史:@Autowired        属于Spring的注解                org.springframework.beans.factor...

    似水的流年
  • 【项目实战】自监控-07-DataFrame行列操作(中篇)

    系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3....

    zishendianxia
  • Android6.0源码分析之menu键弹出popupwindow菜单流程分析

    例如上图,在按下菜单键后会弹出对应的菜单选项,准确来说,是在菜单键弹起后出现的一个popupwindow,那么从菜单键弹起到popupwindow创建所涉及到的...

    fanfan
  • 2017人生总结(MECE分析法)

    静儿

扫码关注云+社区

领取腾讯云代金券