GeorgeYang'Blog

my technology blog

把HTML源码转化成Markdown的工具或代码

阅读:763 创建时间:16-05-21 01:28:46 tags:html,markdown

有时我们需要爬虫将网上的markdown文章转成markdown文件保存,往往需要用到html转markdown的工具,下面是我的搜索汇总:

Pandoc 号称可以在 markdown, reStructuredText, textile, HTML, DocBook, LaTeX, MediaWiki markup, OPML, Emacs Org-Mode, Haddock markup 等多种语言中自由转换,相当强悍;而且是免费软件。不过,我没有成功使用过 Pandoc,在我的 iMac 中安装似乎没有成功。

to-markdown.js 是一个托管在 github 上的项目,专门负责将 HTML 转化为 Markdown。to-markdown.js 的界面为上下两个窗口:在上面的窗口中输入 HTML,下面的窗口自动同步翻译为 Markdown 语言。我今天用它转换了不少 HTML 文件,还算满意。一些较复杂的格式,比如表格,并不支持转换。另外,在我的 mac 系统中有一个 bug:不能使用键盘(command + c)来进行复制,只能使用鼠标。

aTool 在线工具的 Html2MarkDown 和 to-markdown.js 的实现方式和界面几乎一模一样,同样不支持表格转换。但是,HTML2MarkDown 可以使用 command + c 进行复制操作,并且是中文界面。

Markable 也是在线转换 HTML <-> Markdown 的工具,并且支持双向转换,不过需要手动「导出」、另存为新文件,而并不是像 to-markdown.js 和 Html2MarkDown 那样在第二个窗口中同步转化。

转载自这条link

博客出处

html转markdown python版:

 #!/usr/bin/env python
 #encoding=utf8

 from HTMLParser import HTMLParser

 import re
 import os
 import sys

 class Html2MarkdownParser(HTMLParser):
     def __init__(self):
         self._markdown = ''
         self._tag_stack = []
         self._tag_attr_data = {}
         self._handled_tag_body_data = ''
         self._convertible_tags = ['a',
                                   'b', 'blockquote',
                                   'em',
                                   'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr',
                                   'ol',
                                   'p', 'pre',
                                   'strong',
                                   'ul']
         # FIXME: special characters
         HTMLParser.__init__(self)

     def _append_to_markdown(self, new_markdown):
         if len(self._markdown) > 1:
             if re.match('\s', self._markdown[-1:]):
                 self._markdown += new_markdown
             else:
                 self._markdown += ' ' + new_markdown
         else:
             self._markdown += new_markdown

     # <a />
     def handle_start_a(self, attrs):
         self._tag_attr_data = dict(attrs)

     def handle_end_a(self):
         a_tag = ''
         a_tag += '[' + self._handled_tag_body_data + ']'
         a_tag += '(' + self._tag_attr_data.get('href')

         title = self._tag_attr_data.get('title')
         if title:
             a_tag += ' "' + title + '") '
         else:
             a_tag += ') '
         self._append_to_markdown(a_tag)

     # <b />
     def handle_end_b(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('*' + self._handled_tag_body_data + '*')

     # <blockquote />
     def handle_end_blockquote(self):
         blockquote_body = self._handled_tag_body_data.split(os.linesep)

         for blockquote_line in blockquote_body:
             blockquote_line = blockquote_line.strip()
             self._append_to_markdown('> ' + blockquote_line + os.linesep)

     # <em />
     def handle_end_em(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('*' + self._handled_tag_body_data + '*')

     # <h1 />
     def handle_end_h1(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('# ' + self._handled_tag_body_data + ' #' + os.linesep)

     # <h2 />
     def handle_end_h2(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('## ' + self._handled_tag_body_data + ' ##' + os.linesep)

     # <h3 />
     def handle_end_h3(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('### ' + self._handled_tag_body_data + ' ###' + os.linesep)

     # <h4 />
     def handle_end_h4(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('#### ' + self._handled_tag_body_data + ' ####' + os.linesep)

     # <h5 />
     def handle_end_h5(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('##### ' + self._handled_tag_body_data + ' #####' + os.linesep)

     # <h6 />
     def handle_end_h6(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('###### ' + self._handled_tag_body_data + ' ######' + os.linesep)

     # <hr />
     def handle_start_hr(self, attrs):
         self._append_to_markdown('* * *' + os.linesep)

     # <li />
     def handle_end_li(self):
         if len(self._tag_stack):
             if self._tag_stack[-1] == 'ol':
                 self._append_to_markdown('1.    ' + self._handled_tag_body_data + os.linesep)
             elif self._tag_stack[-1] == 'ul':
                 self._append_to_markdown('*    ' + self._handled_tag_body_data + os.linesep)

     # <p />
     def handle_start_p(self, attrs):
         if len(self._markdown) > 1:
             if self._markdown[-2:] == '%s%s' % (os.linesep, os.linesep):
                 pass
             elif self._markdown[-1:] == os.linesep:
                 self._markdown += os.linesep
             else:
                 self._markdown += os.linesep + os.linesep

     def handle_end_p(self):
         self._markdown += '%s%s' % (os.linesep, os.linesep)

     # <pre />
     def handle_end_pre(self):
         code_lines = self._handled_tag_body_data.split('\n')
         for code_line in code_lines:
             self._append_to_markdown('    ' + code_line + os.linesep)

     # <strong />
     def handle_end_strong(self):
         self._handled_tag_body_data = self._handled_tag_body_data.replace(os.linesep, ' ')
         self._append_to_markdown('**' + self._handled_tag_body_data + '**')

     ## ###
     def handle_starttag(self, tag, attrs):
         self._tag_stack.append(tag)
         try:
             eval('self.handle_start_' + tag + '(attrs)')
         except AttributeError, e:
             pass

     def handle_endtag(self, tag):
         self._tag_stack.pop()
         try:
             eval('self.handle_end_' + tag + '()')
             # Collapse three successive CRs into two before moving on
             while len(self._markdown) > 2 and\
                   self._markdown[-3:] == '%s%s%s' % (os.linesep, os.linesep, os.linesep):
                 self._markdown = self._markdown[:-3] + '%s%s' % (os.linesep, os.linesep)
         except AttributeError, e:
             pass

         self._tag_attr_data = {}
         self._handled_tag_body_data = ''

     def handle_data(self, data):
         data = os.linesep.join(data.strip().split(os.linesep))
         if len(self._tag_stack) and self._tag_stack[-1] not in ['p']:
             self._handled_tag_body_data += data
         else:
             self._append_to_markdown(data)

     def get_markdown(self):
         return self._markdown.rstrip() + '\n'

 def main():
     p = Html2MarkdownParser()
     buf = ''' here place your html code'''
     p.feed(buf)
     p.close()
     print p.get_markdown()

 if __name__ == "__main__":
     sys.exit(main())

 #出自:http://outofmemory.cn/code-snippet/78565/JAVA-meishi-tianxia-interface-call-code-example

出自:https://github.com/wuyuze/spider/blob/5c74b6a3f15a48f377bd3dc3174506870d80dd54/soup/mark.py

html转markdown java版

github地址: https://github.com/qq179157977/jHTML2Md

 获取网络内容
 URL url = new URL("http://www.example.com/");
 HTML2Md.convert(url, 30000);
 获取markdown
 HTML2Md.htmlToJekyllMd(htmlPath, mdPath, charset);
 HTML2Md.htmlToHexoMd(htmlPath, mdPath, charset);

另外一个不错的html转markdown工具: https://github.com/myabc/markdownj