Answers
难点在于并非所有的html都能找到对应的md表示方式,尤其是涉及到复杂的样式的时候。md是从上到下的流式布局,而现在大多数的html则可以拥有更为复杂的布局方式,所以几乎不可能实现通用的html到md解决方案,针对特定的网站页面的话可能就会相对容易一些。
值得一提的是,md兼容html,所以对于实在不能转换的部分你保留原html试试,当然前提是你需要使用能够兼容html的md解析器。(我很想在给你的回复里面写一段html的table的,但是遗憾sf的md并没有支持这个特性)你可以试试这个在线的md编辑器 http://dillinger.io/
我觉得html转markdown有两大难点:
一个是markdown语言表现力不如html,也就是前面诸位说的,并非每个html标签都能找到对应的markdown语法。比如dl dd dt标签就没有对应的markdown语法。还有canvas,video之类就更不用说了。
第二个难点是html页面基本不是语义化的页面,即使页面尽可能使用语义化的标签,还是免不了为了配合视觉需要而设置冗余的标签。markdown如此流行的一大原因是它的纯文本状态和格式化后的状态基本是等价可读的。而由于css这朵奇葩的存在,html标签已经可以让dom结构完全和渲染出来的结果不是一个东西。
如果想要完成从html向markdown的转化,可以考虑先像readibility一样把网页简化成只有文档结构的内容,然后再向markdown转化。
span和table没有对应的markdown语法(table有变种markdown语法)
包括html的属性 class等等也没有markdown对应
所以转换的时候通常只能舍弃或者直接保留html(因为markdown支持直接内嵌html)
作为通用解决方案,我觉得很难找到更好的方法了,但聚焦到独立的场景,打比方说希望
<span class="strong>word</span>
=>
**word**
的话还是很容易实施的,可以用
cheerio
之类的dom工具预处理,抓
span.class
先转换成
strong
标签然后再送到开源的通用html2md实现里即可