python使用html2text库实现从HTML转markdown的方法详解
作者:WDC 发布时间:2023-07-18 09:00:03
如果PyPi上搜html2text的话,找到的是另外一个库:Alir3z4/html2text。这个库是从aaronsw/html2text fork过来,并在此基础上对功能进行了扩展。因此是直接用pip安装的,因此本文主要来讲讲这个库。
首先,进行安装:
pip install html2text
命令行方式使用html2text
安装完后,就可以通过命令html2text进行一系列的操作了。
html2text命令使用方式为:html2text [(filename|url) [encoding]]。通过html2text -h,我们可以查看该命令支持的选项:
选项 | 描述 |
---|---|
--version | 显示程序版本号并退出 |
-h, --help | 显示帮助信息并退出 |
--no-wrap-links | 转换期间包装链接 |
--ignore-emphasis | 对于强调,不包含任何格式 |
--reference-links | 使用参考样式的链接,而不是内联链接 |
--ignore-links | 对于链接,不包含任何格式 |
--protect-links | 保护链接不换行,并用尖角括号将其围起来 |
--ignore-images | 对于图像,不包含任何格式 |
--images-to-alt | 丢弃图像数据,只保留替换文本 |
--images-with-size | 将图像标签作为原生html,并带height和width属性,以保留维度 |
-g, --google-doc | 转换一个被导出为html的谷歌文档 |
-d, --dash-unordered-list | 对于无序列表,使用破折号而不是星号 |
-e, --asterisk-emphasis | 对于被强调文本,使用星号而不是下划线 |
-b BODY_WIDTH, --body-width=BODY_WIDTH | 每个输出行的字符数,0表示不自动换行 |
-i LIST_INDENT, --google-list-indent=LIST_INDENT | Google缩进嵌套列表的像素数 |
-s, --hide-strikethrough | 隐藏带删除线文本。只有当也指定-g的时候才有用 |
--escape-all | 转义所有特殊字符。输出较为不可读,但是会避免极端情况下的格式化问题。 |
--bypass-tables | 以HTML格式格式化表单,而不是Markdown语法。 |
--single-line-break | 在一个块元素后使用单个换行符,而不是两个换行符。注意:要求–body-width=0 |
--unicode-snob | 整个文档中都使用unicode |
--no-automatic-links | 在任何适用情况下,不要使用自动链接 |
--no-skip-internal-links | 不要跳过内部链接 |
--links-after-para | 将链接置于每段之后而不是文档之后 |
--mark-code | 用…将代码块标记出来 |
--decode-errors=DECODE_ERRORS | 如何处理decode错误。接受值为'ignore', ‘strict'和'replace' |
具体使用如下:
# 传递url
html2text http://eepurl.com/cK06Gn
# 传递文件名,编码方式设置为utf-8
html2text test.html utf-8
脚本中使用html2text
除了直接通过命令行使用html2text外,我们还可以在脚本中将其作为库导入。
我们以以下html文本为例
html_content = """
<span style="font-size:14px"><a href="http://blog.yhat.com/posts/visualize-nba-pipelines.html" rel="external nofollow" target="_blank" style="color: #1173C7;text-decoration: underline;font-weight: bold;">Data Wrangling 101: Using Python to Fetch, Manipulate & Visualize NBA Data</a></span><br>
A tutorial using pandas and a few other packages to build a simple datapipe for getting NBA data. Even though this tutorial is done using NBA data, you don't need to be an NBA fan to follow along. The same concepts and techniques can be applied to any project of your choosing.<br>
"""
一句话转换html文本为Markdown格式的文本:
import html2text
print html2text.html2text(html_content)
输出如下:
[Data Wrangling 101: Using Python to Fetch, Manipulate & Visualize NBA
Data](http://blog.yhat.com/posts/visualize-nba-pipelines.html)
A tutorial using pandas and a few other packages to build a simple datapipe
for getting NBA data. Even though this tutorial is done using NBA data, you
don't need to be an NBA fan to follow along. The same concepts and techniques
can be applied to any project of your choosing.
另外,还可以使用上面的配置项:
import html2text
h = html2text.HTML2Text()
print h.handle(html_content) # 输出同上
注意:下面仅展示使用某个配置项时的输出,不使用某个配置项时使用默认值的输出(如无特殊说明)同上。
--ignore-emphasis
指定选项–ignore-emphasis
h.ignore_emphasis = True
print h.handle("<p>hello, this is <em>Ele</em></p>")
输出为:
hello, this is Ele
不指定选项–ignore-emphasis
h.ignore_emphasis = False # 默认值
print h.handle("<p>hello, this is <em>Ele</em></p>")
输出为:
hello, this is _Ele_
--reference-links
h.inline_links = False
print h.handle(html_content)
输出为:
[Data Wrangling 101: Using Python to Fetch, Manipulate & Visualize NBA
Data][16]
A tutorial using pandas and a few other packages to build a simple datapipe
for getting NBA data. Even though this tutorial is done using NBA data, you
don't need to be an NBA fan to follow along. The same concepts and techniques
can be applied to any project of your choosing.
[16]: http://blog.yhat.com/posts/visualize-nba-pipelines.html
--ignore-links
h.ignore_links = True
print h.handle(html_content)
输出为:
Data Wrangling 101: Using Python to Fetch, Manipulate & Visualize NBA Data
A tutorial using pandas and a few other packages to build a simple datapipe
for getting NBA data. Even though this tutorial is done using NBA data, you
don't need to be an NBA fan to follow along. The same concepts and techniques
can be applied to any project of your choosing.
--protect-links
h.protect_links = True
print h.handle(html_content)
输出为:
[Data Wrangling 101: Using Python to Fetch, Manipulate & Visualize NBA
Data](<http://blog.yhat.com/posts/visualize-nba-pipelines.html>)
A tutorial using pandas and a few other packages to build a simple datapipe
for getting NBA data. Even though this tutorial is done using NBA data, you
don't need to be an NBA fan to follow along. The same concepts and techniques
can be applied to any project of your choosing.
--ignore-images
h.ignore_images = True
print h.handle('<p>This is a img: <img src="https://my.oschina.net/img/hot3.png" style="max-height: 32px; max-width: 32px;" alt="hot3"> ending ...</p>')
输出为:
This is a img: ending ...
--images-to-alt
h.images_to_alt = True
print h.handle('<p>This is a img: <img src="https://my.oschina.net/img/hot3.png" style="max-height: 32px; max-width: 32px;" alt="hot3"> ending ...</p>')
输出为:
This is a img: hot3 ending ...
--images-with-size
h.images_with_size = True
print h.handle('<p>This is a img: <img src="https://my.oschina.net/img/hot3.png" height=32px width=32px alt="hot3"> ending ...</p>')
输出为:
This is a img: <img src='https://my.oschina.net/img/hot3.png' width='32px'
height='32px' alt='hot3' /> ending ...
--body-width
h.body_width=0
print h.handle(html_content)
输出为:
[Data Wrangling 101: Using Python to Fetch, Manipulate & Visualize NBA Data](http://blog.yhat.com/posts/visualize-nba-pipelines.html)
A tutorial using pandas and a few other packages to build a simple datapipe for getting NBA data. Even though this tutorial is done using NBA data, you don't need to be an NBA fan to follow along. The same concepts and techniques can be applied to any project of your choosing.
--mark-code
h.mark_code=True
print h.handle('<pre class="hljs css"><code class="hljs css"> <span class="hljs-selector-tag"><span class="hljs-selector-tag">rpm</span></span> <span class="hljs-selector-tag"><span class="hljs-selector-tag">-Uvh</span></span> <span class="hljs-selector-tag"><span class="hljs-selector-tag">erlang-solutions-1</span></span><span class="hljs-selector-class"><span class="hljs-selector-class">.0-1</span></span><span class="hljs-selector-class"><span class="hljs-selector-class">.noarch</span></span><span class="hljs-selector-class"><span class="hljs-selector-class">.rpm</span></span></code></pre>')
输出为:
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
通过这种方式,就可以以脚本的形式自定义HTML -> MARKDOWN的自动化过程了。例子可参考下面的例子
#-*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import re
import requests
from lxml import etree
import html2text
# 获取第一个issue
def get_first_issue(url):
resp = requests.get(url)
page = etree.HTML(resp.text)
issue_list = page.xpath("//ul[@id='archive-list']/div[@class='display_archive']/li/a")
fst_issue = issue_list[0].attrib
fst_issue["text"] = issue_list[0].text
return fst_issue
# 获取issue的内容,并转成markdown
def get_issue_md(url):
resp = requests.get(url)
page = etree.HTML(resp.text)
content = page.xpath("//table[@id='templateBody']")[0]#'//table[@class="bodyTable"]')[0]
h = html2text.HTML2Text()
h.body_width=0 # 不自动换行
return h.handle(etree.tostring(content))
subtitle_mapping = {
'**From Our Sponsor**': '# 来自赞助商',
'**News**': '# 新闻',
'**Articles**,** Tutorials and Talks**': '# 文章,教程和讲座',
'**Books**': '# 书籍',
'**Interesting Projects, Tools and Libraries**': '# 好玩的项目,工具和库',
'**Python Jobs of the Week**': '# 本周的Python工作',
'**New Releases**': '# 最新发布',
'**Upcoming Events and Webinars**': '# 近期活动和网络研讨会',
}
def clean_issue(content):
# 去除‘Share Python Weekly'及后面部分
content = re.sub('\*\*Share Python Weekly.*', '', content, flags=re.IGNORECASE)
# 预处理标题
for k, v in subtitle_mapping.items():
content = content.replace(k, v)
return content
tpl_str = """原文:[{title}]({url})
---
{content}
"""
def run():
issue_list_url = "https://us2.campaign-archive.com/home/?u=e2e180baf855ac797ef407fc7&id=9e26887fc5"
print "开始获取最新的issue……"
fst = get_first_issue(issue_list_url)
#fst = {'href': 'http://eepurl.com/dqpDyL', 'title': 'Python Weekly - Issue 341'}
print "获取完毕。开始截取最新的issue内容并将其转换成markdown格式"
content = get_issue_md(fst['href'])
print "开始清理issue内容"
content = clean_issue(content)
print "清理完毕,准备将", fst['title'], "写入文件"
title = fst['title'].replace('- ', '').replace(' ', '_')
with open(title.strip()+'.md', "wb") as f:
f.write(tpl_str.format(title=fst['title'], url=fst['href'], content=content))
print "恭喜,完成啦。文件保存至%s.md" % title
if __name__ == '__main__':
run()
这是一个每周跑一次的python weekly转markdown的脚本。
好啦,html2text就介绍到这里了。如果觉得它还不能满足你的要求,或者想添加更多的功能,可以fork并自行修改。
来源:https://ictar.xyz/2017/03/18/好物推荐:从HTML到markdown%20-%20html2text/


猜你喜欢
- 引言做接口测试的时候,避免不了操作数据库。因为数据校验需要,测试数据初始化需要、一些参数化场景需要等。数据库操作框架设计这里主要操作mysq
- 背景大家好,我是J哥。我们常常面临着大量的重复性工作,通过人工方式处理往往耗时耗力易出错。而Python在办公自动化方面具有天然优势,分分钟
- 在javascript中原型(prototype)定义了特定类型的所有实例都可以访问的属性和方法,很多些情况下需要重新对原型中的属性赋值,如
- 项目整体布局创建并进入项目文件夹:$ mkdir flask-tutorial$ cd flask-tutorial接下来按照 安装简介 设
- 大家都知道 在Python 中可以用如下方式表示正负无穷:float("inf") # 正无穷float("-
- Redo LogREDO LOG称为重做日志 ,当MySQL服务器意外崩溃或者宕机后,保证已经提交的事务持久化到磁盘中(持久性)。InnoD
- 本文实例讲述了Python获取任意xml节点值的方法。分享给大家供大家参考。具体实现方法如下:# -*- coding: utf-8 -*-
- 随机漫步是这样行走得到的途径:每次行走都是完全随机的,没有明确的方向,结果是由一系列随机决策决定的。random_walk.py#rando
- 前言:我目前使用的服务器为centos6.x 系统自带的python的版本为2.6.x,但是目前无论是学习还是使用python,python
- 一、安装步骤 1.官网下载安装包2.安装一路next即可,安装位置可改到D盘3.添加环境变量将如上路径添加到系统path,不会的参
- 前言最近因为工作需要要使用PHP 7,所以从网上找教程进行安装, 结果编译没问题, 安装的时候报了错误。错误如下cp -pR -f phar
- IE的有条件注释是一种专有的(因此是非标准的)、对常规(X)HTML注释的Miscrosoft扩展。顾名思义,有条件注释使你能够根据条件(比
- “表情包”是当前社交软件上不可或缺的交流方式,难以用文字表达的意思,发一个“表情包”,对方就能心领神会。下面是小派制作的一个表情包,准确地讲
- JavaScript中,对象的extensible属性用于表示是否允许在对象中动态添加新的property。ECMAScript 3标准中,
- 目录一、简单文本类型数据二、复杂型表格提取三、图片型表格提取大家好,从PDF中提取信息是办公场景中经常需要用到的操作,也是经常又读者在后台问
- 数据库文件在使用过程中,日志文件会越来越大。小则几个G,大的可能几十上百G都有可能,有时实在是没有必要为它浪费太大的硬盘存储空间。所以可以把
- MySQL多字段相同数据去重复MySQL多字段去重复实际上是单字段去重复的衍生,原理就是把多字段数据通过子查询合并为单字段的数据表,再通过单
- 如下所示:import pandas as pdfrom pandas import DataFrameseries = pd.read_c
- 基本环境配置python 3.6pycharmrequestscsvtime相关模块pip安装即可目标网页分析网页一切的一切都在图里找到数据
- 一:什么是数据库,为什么要有数据库?数据,数据库,数据库管理系统和数据库系统是与数据库技术密切相关的四个基本概念。数据库相信大家都耳熟能详了