社区编辑申请
注册/登录
用Python将微信热文转换成Word文档 | 神级操作
开发 后端
不得不说微信公众号已经成为了一个开放平台,每天数以万计的微信公众号文章在这产生,我们关注一个微信公众号每天便可以看到新的文章,我们同时也不知不觉的将好的文章分享到给朋友。

 不得不说微信公众号已经成为了一个开放平台,每天数以万计的微信公众号文章在这产生,我们关注一个微信公众号每天便可以看到新的文章,我们同时也不知不觉的将好的文章分享到给朋友。

那么如何保存一个好的文章呢?普遍选择收藏,然而在这里,我提供一个更巧妙的方法,直接转换成word文档保存在电脑里面。即便是以后文章404了,我们还可以看得到嘛。

1、微信热文源代码分析

一篇微信文章,url开头一定是https://mp.weixin.qq.com/s/,后面跟着一长串字符串,比如qLjifoyinoVN5i5vjW0f7w。

查看网页源代码,我们发现

微信热文的网页源代码很长,即便是上面的一个很简短的文章,但我们要从中提取到我们想要的东西,比如

  1. <h2idh2id="activity-name">普京再次出面</h2> 

妥妥的文章题目,我们要把它保存为word文档,题目肯定少不了。 

  1. <div id="js_profile_qrcode"class="profile_container" style="display:none;">  
  2.  <div>  
  3.    <strong>环球时报</strong>  
  4.    <imgidimgid="js_profile_qrcode_img" src="" alt="">  
  5.    <p>  
  6.      <label>微信号</label>  
  7.      <spanclassspanclass="profile_meta_value">hqsbwx</span></p>  
  8.    <p>  
  9.      <label>功能介绍</label>  
  10.      <span>报道多元世界 解读复杂中国</span></p>  
  11.  </div> 

这里一下子就提示了这篇文章是那个微信号发布的,而且还有微信号的介绍,这也是我们需要的信息 

  1. <div id="js_content" style="visibility: hidden;"> 

这个就是正文的标签了,这个标签里面蕴含着正文,下面是正文的第一个标签,我们将它格式化一下,如下

我们发现section套了很多层,但是实际上,这第一个标签就这一句话是重点:“俄总统普京同纳卡冲突双方领导人举行电话会谈。”

下一个标签也是section,但是涵盖了好几句话。我们发现了span标签和strong标签。而且出现了很多次rgb(),我们知道rgb是代表标签内字体的颜色的。当然,strong是标签内加粗咯。 

  1. <img data-ratio="0.7717391304347826" datadata-s="300,640"data-type="jpeg" data-w="828" datadata-backw="578"data-backh="446" src="https://mmbiz.qpic.cn/mmbiz_jpg/qkQTRn2Z9NwC8nNHScsBAFeOFtHHb95ftWKOZve0QJMqJPFtoicdYO8uTWom8fBdG07icCKDo0FoyNjHUyoBibI2g/640?wx_fmt=jpeg"style="text-align: center;width: 660.994px;box-sizing: border-box!important;visibility: visible !important;"  /> 

另一个图片标签 

  1. <img data-ratio="1.345"src="https://mmbiz.qpic.cn/mmbiz_gif/wlCrBZoK8HF5AE2ibhItnFJgoIQBcJhTzO438azQniaRJRYNFk0CzlORnm0g1hG7HX3bhXAIC1J4E2XGb1WKA4qA/640?wx_fmt=gif"data-type="gif" data-w="200" style="vertical-align:middle;box-sizing: border-box;" /> 

这个是图片的标签,里面蕴含着很多重要的东西,比如,data-type="gif",表明这是一个gif文件,src指向了图片的地址,data-w="200",代表图片的宽度,这很重要。

格式化后的内容如下所示

标签套标签,让人眼花缭乱。

不过,还是一步一步来吧。

2、设计代码,步步分析

这一步我们需要开始编写代码了,python-docx是一个生成和处理docx的第三方库,使用pip install python-docx 一键下载

需要用到的第三方库有,python-docx,bs4(用于html解析处理) 

  1. from docx import Document  
  2. from docx.oxml.ns import qn  
  3. import re  
  4. from docx.shared import RGBColor,Inches,Pt  
  5. from urllib.request import urlopen,Request  
  6. from bs4 import BeautifulSoup  
  7. from docx.enum.text import WD_PARAGRAPH_ALIGNMENT  
  8. import io  
  9. from os.path import join  
  10. qingqiu={'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",  
  11.       'Accept':'text/plain, text/html'  
  12.       } 

编写一个简单的过滤函数,因为我们得到文章标题后,需要将文章标题中一些字符删去,比如换行符,空格,以及{}?

/|\等字符,因为含有这些字符的字符串不能做文件名 

  1. def guolv(text):  
  2.     t = re.sub('\s', '', text)  
  3.     t = re.sub('[?<>()[\]{}|]', ':', t)  
  4.     return t 

假设微信url已经确定,在这里我们编写一个类,这个类专门用来处理的。 

  1. class WX_doc():  
  2.     def __init__(self, url, path):  
  3.         self.img_num = 0  
  4.         self.doc = Document()  
  5.         self.doc.styles['Normal'].font.name = '微软雅黑'  
  6.         self.doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')  
  7.         self.url = url  
  8.         self.path = path 

self.img_num是针对img处理的,每处理一个img,self.img_num+=1,请注意,最好设置好文章的字体,因为python-docx默认字体显示中文会比较难看……不信你可以去试试。当然也可以将字体设为宋体

url是指微信热文的链接,path是Word文档处理完后的保存路径。

接下来是一个插入一个标题的方法。

注:

我们设单独的def开头的为函数,包含在class内的def开头的为方法 

  1. def head(self, title, lv=3size=13):  
  2.     p = self.doc.add_heading('', lv)  
  3.     p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  
  4.     r = p.add_run(title)  
  5.     r.font.name = '微软雅黑'  
  6.     r.font.color.rgb = RGBColor(0, 0, 0)  
  7.     r.font.size = Pt(size)  
  8.     r._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑') 

将标题插入后,设置为居中,颜色黑色,大小默认13,字体微软雅黑。

2、巧妙处理标签

对于正文来讲,标签套标签让人眼花缭乱,然而我们如何处理正文中的文字,图像甚至表格呢?

,对于标签套标签,我设计的思路是:

用对应的标签方法处理标签 

  1. hd = Request(self.url, headers=qingqiu 
  2. a = urlopen(hd)  
  3. b = a.read()  
  4. bbb = b.decode('UTF-8')  
  5. bs = BeautifulSoup(bb, 'lxml')  
  6. h2 = bs.find('h2', {'class': "rich_media_title"})  
  7. title = guolv(h2.text)  
  8. self.head(title, 2, 18)  
  9. pingtai = bs.find('strong', {'class': "profile_nickname"})  
  10. PMV=bs.findAll('span',{'class':'profile_meta_value'})  
  11. p = self.doc.add_paragraph()  
  12. r = p.add_run('%s' % pingtai.text)  
  13. r.font.bold = True  
  14. r.font.color.rgb = RGBColor(0, 191, 255)  
  15. r.font.size = Pt(12)  
  16. r=p.add_run('(%s: %s)'%(PMV[0].text,PMV[1].text))  
  17. r.font.size = Pt(9)  
  18. wb = bs.find('div', {'class': "rich_media_content"}) 

这样一处理,bs就是整篇微信文章的BeautifulSoup结构的html,这样处理就方便的多。

对于标题和发布者的,我们放到后面处理,现在要考虑正文的处理,wb就是正文的bs结构。

如何编写标签函数?我假定只关注字体的颜色和加粗,其余字体大小不考虑(这样的话保存的文章样式是一致的),使用RGB代表颜色,比如RGB=(0,0,0)就是纯黑了,bold代表加粗,bold=True就是加粗。

<p>标签

p代表段落,p标签内的文字会形成一个段。对应doc中的add_paragraph方法,接下来我们编写WX_doc的第一个标签处理方法。默认字体颜色黑色,不加粗。 

  1. def para(self, label):  
  2.     p = self.doc.add_paragraph('')  
  3.     for i in label:  
  4.         self.transit(i,p, (0, 0, 0), False) 

这样就完了,主要操作就是,将p中每一个标签拿出来,交给transit函数处理,transit会针对相应的标签交给相应的标签方法。

但是如果出现这样的情况,p内含p,就像section一样一层套一层,那么需要另一个p处理方法 

  1. def para2(self,label,p,RGB,bold):  
  2.     "解决p内含p的情况"  
  3.     for i in label:  
  4.         self.transit(i,p, RGB, bold) 

对于后面的标签处理方法,我们规定,需4个参数,第一个BeautifulSoup结构的标签label,第二个,所属的段落p,为doc.add_paragraph方法返回的段落p,第三个和第四个为RGB和bold。

<span>标签

Span标签出险率极高,基本上每段文字都会出现,我们假定span中的style设定文字的颜色。

比如这一段span

  1. <spanstylespanstyle="letter-spacing: 1px;font-size: 16px;font-family: helvetica;color: rgb(123,12, 0);"><strong>普京与两国领导人讨论了本月9日三方签订的停火协议落实问题。各方对当前冲突接触线的平静局势感到满意。</strong></span> 

多次观察后,编写的处理方法如下 

  1. def span(self, label, p, RGB, bold):  
  2.     attr = label.attrs.get('style')  
  3.     if attr:  
  4.         ys = re.findall('(?<=rgb\()[\s\S]+?(?=\))', attr)  
  5.     else:  
  6.         ys=[]  
  7.     if ys:  
  8.         rgb = re.findall('\d+', ys[0])  
  9.         r = int(rgb[0])  
  10.         g = int(rgb[1])  
  11.         b = int(rgb[2]) 
  12.         RGB = (r, g, b) 
  13.     for i in label:  
  14.         if i.name == None:  
  15.             self.text(i,p, RGB, bold)  
  16.         elif i.name == "strong":  
  17.             self.strong(i,p, RGB, bold)  
  18.         else:  
  19.             self.transit(i,p, RGB, bold) 

当BeautifulSoup结构下的标签结构为None时,它就是一段纯文字

Text 纯文字处理

处理纯文字用的方法,需要注意的是,要将文字中的换行符删去。 

  1. def text(self, i, p, RGB, bold):  
  2.     i=str(i)  
  3.     ii=i.replace('\n','')  
  4.     r = p.add_run(i)  
  5.     r.font.bold = bold  
  6.     r.font.color.rgb = RGBColor(RGB[0], RGB[1], RGB[2]) 

<strong>标签

Strong就是加粗 

  1. def strong(self, label, p, RGB, bold):  
  2.     for i in label:  
  3.         if i.name == None:  
  4.             self.text(i,p, RGB, True)  
  5.         elif i.name == 'span':  
  6.             self.span(i,p, RGB, True) 

<section>标签

Section常常会出现套叠的情况,即便是里面有字体颜色大小的指示,我还是以span指示的颜色为准。那么如何正确处理section便是一个难题。 

  1. <sectionstylesectionstyle="font-family: -apple-system-font, BlinkMacSystemFont, &quot;HelveticaNeue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino SansGB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;MicrosoftYaHei&quot;, Arial, sans-serif;letter-spacing: 0.544px;white-space:normal;background-color: rgb(255, 255, 255);line-height: 1.5em;margin-left:0px;margin-right: 0px;"> 
  2.         <span style="color: rgb(136,136, 136);font-family: helvetica;font-size: 14px;font-weight:700;letter-spacing: 1px;text-align: left;text-indent: 28px;widows: 1;"></span> 
  3.          <span style="color: rgb(136,136, 136);font-family: helvetica;font-size: 14px;font-weight:700;letter-spacing: 1px;text-align: left;text-indent: 28px;widows: 1;">俄总统网站声明截图</span></section> 

 上面的section中出现了span,所以思路来了,遍历section中的标签,如果出现span和stong,直接按段落处理 

  1. def section(self,label):  
  2.     for i in label:  
  3.         if i.name=='p':  
  4.             self.para(i)  
  5.         elif i.name in ['span','strong']:  
  6.             self.para(label)  
  7.             return 0  
  8.         elif i.name=='section':  
  9.             self.section(i)  
  10.         elif i.name in ['ul','ol']:  
  11.             self.ul2(i)  
  12.         elif i.name=='img':  
  13.             self.img(i)  
  14.         elif i.name in ['br','svg','center']:  
  15.             pass  
  16.         elif i.name=='blockquote':  
  17.             self.blockquote(i)  
  18.         elif i.name=='pre':  
  19.             self.pre(label)  
  20.         else:  
  21.             print('section中:%s:%s'%(i.name,str(i))) 

最后else表示没有这个标签的处理函数,就提示这个标签的位置,以及名称,所含内容

<img>标签

我们知道img标签是图像,一篇文章加上图像可谓画龙点睛,现在很少出现没有图的文章了,正所谓有图有真相。

以下面两个图像为例 

  1. <img datadata-ratio="0.7717391304347826"data-s="300,640" data-type="jpeg" datadata-w="828"data-backw="578" data-backh="446"src="https://mmbiz.qpic.cn/mmbiz_jpg/qkQTRn2Z9NwC8nNHScsBAFeOFtHHb95ftWKOZve0QJMqJPFtoicdYO8uTWom8fBdG07icCKDo0FoyNjHUyoBibI2g/640?wx_fmt=jpeg"style="text-align: center;width: 660.994px;box-sizing: border-box!important;visibility: visible !important;"  /> 
  2. <imgdata-ratioimgdata-ratio="1.345"src="https://mmbiz.qpic.cn/mmbiz_gif/wlCrBZoK8HF5AE2ibhItnFJgoIQBcJhTzO438azQniaRJRYNFk0CzlORnm0g1hG7HX3bhXAIC1J4E2XGb1WKA4qA/640?wx_fmt=gif"data-type="gif" data-w="200" style="vertical-align:middle;box-sizing: border-box;" /> 

我们发现data-w是设定图片的宽度,当图片过大的时候,需要将图片宽度设定好。Img处理函数如下 

  1. def img(self, label):  
  2.     src = label.attrs['src']  
  3.     da_s = label.attrs.get('data-s')  
  4.     data_type = label.attrs.get('data-type')  
  5.     data_w = label.attrs.get('data-w')  
  6.     self.img_num += 1  
  7.     a = urlopen(src)  
  8.     b = a.read()  
  9.     path = io.BytesIO(b)  
  10.     if da_s:  
  11.         num = re.findall('\d+', da_s)  
  12.         h = int(num[0]) // 75  
  13.         w = int(num[1]) // 75  
  14.         if w > 6:  
  15.             self.doc.add_picture(path, width=Inches(6))  
  16.         else:  
  17.             self.doc.add_picture(path, width=Inches(w), height=Inches(h))  
  18.     elif data_w:  
  19.         data_w = int(data_w)  
  20.         if data_w < 75:  
  21.             # 标签太小,直接忽略  
  22.             print('忽略太小图片%d.%s' % (self.img_num, data_type))  
  23.         elif data_w > 450:  
  24.             self.doc.add_picture(path, width=Inches(6))  
  25.         else:  
  26.             self.doc.add_picture(path, width=Inches(data_w / 75))  
  27.     else:  
  28.         self.doc.add_picture(path, width=Inches(6))  
  29.     print("图片%d打入成功!" % (self.img_num - 1)) 

transit方法

最后我们编写transit方法 

  1. def transit(self, label, p, RGB, bold):  
  2.     "本函数提供label的中转方案 其中br由中转方案解决"  
  3.     if label.name == 'span':  
  4.         self.span(label, p,RGB,bold)  
  5.     elif label.name == None:  
  6.         self.text(label, p,RGB,bold)  
  7.     elif label.name in ['strong','em']:  
  8.         self.strong(label, p,RGB,bold)  
  9.     elif label.name=='section':  
  10.         self.section(label)  
  11.     elif label.name =='p':  
  12.         self.para2(label,p,RGB,bold)  
  13.     elif label.name == 'img':  
  14.         self.img(label)  
  15.     elif label.name in ['br','svg','mpcpc','center']:  
  16.         pass  
  17.     elif label.name == 'a':  
  18.         self.link(label, p,RGB,bold)  
  19.     elif label.name == 'iframe':  
  20.         self.iframe(label, p)  
  21.     elif label.name == 'blockquote':  
  22.         self.blockquote(label)  
  23.     elif label.name == 'ul':  
  24.         self.ul(label, p)  
  25.     elif label.name=='pre':  
  26.         self.pre(label)  
  27.     else:  
  28.         print('p中:%s %s'%(str(label.name),str(label.text)))  
  29.         t = label.text  
  30.         if len(t) < 2:  
  31.             return 0  
  32.         r = p.add_run(t)  
  33.         r.font.bold = bold  
  34.         r.font.color.rgb = RGBColor(RGB[0], RGB[1], RGB[2]) 

transit函数要处理一个标签,如果已经编写好了这个标签方法,那么将这个标签交给对应的标签方法处理,如果没有,就提示这个标签的位置,以及名称,所含内容

main 核心处理

最后我们当然是处理并且转换成文档啦,加入文章标题,发布者,和内容,直接发完整代码吧,如下: 

  1. def main(self) -> None:  
  2.     hd = Request(self.url, headers=qingqiu 
  3.     a = urlopen(hd)  
  4.     b = a.read()  
  5.     bbb = b.decode('UTF-8')  
  6.     bs = BeautifulSoup(bb, 'lxml')  
  7.     h2 = bs.find('h2', {'class': "rich_media_title"})  
  8.     title = guolv(h2.text)  
  9.     self.head(title, 2, 18)  
  10.     pingtai = bs.find('strong', {'class': "profile_nickname"})  
  11.     PMV=bs.findAll('span',{'class':'profile_meta_value'})  
  12.     p = self.doc.add_paragraph()  
  13.     r = p.add_run('%s' % pingtai.text)  
  14.     r.font.bold = True 
  15.     r.font.color.rgb = RGBColor(0, 191, 255)  
  16.     r.font.size = Pt(12)  
  17.     r=p.add_run('(%s: %s)'%(PMV[0].text,PMV[1].text))  
  18.     r.font.size = Pt(9)  
  19.     wb = bs.find('div', {'class': "rich_media_content"})  
  20.     for i in wb:  
  21.         if i.name =='p':  
  22.             self.para(i)  
  23.         elif i.name=='section':  
  24.             self.section(i)  
  25.         elif i.name == 'blockquote':  
  26.             self.blockquote(i)  
  27.         elif i.name == 'table':  
  28.             self.table(i)  
  29.         elif i.name in[None,'center','hr']:  
  30.             pass  
  31.         elif i.name in ['h1', 'h2', 'h3','h4']:  
  32.             self.head(i.text, int(i.name[1]) + 1)  
  33.         elif i.name in ['ul','ol']:  
  34.             self.ul2(i) 
  35.          elif i.name == 'pre':  
  36.             self.pre(i)  
  37.         else:  
  38.             print("%s"%str(i))  
  39.     self.save_docx(title)  
  40.     wz_pa=join(self.path,title+'.docx')  
  41.     print('文档保存成功!保存路径:%s'%wz_pa)  
  42.     self.ok=False  
  43.     print(wz_pa) 

3、实战测试

运行后输入微信url,结果如下:

保存下来的Word文档如下:

4、其他标签的处理说明

刚刚我们仅仅是编写了section,span,p,strong等标签,就可以对付一个简单的文章,但是实际上还有其他的标签,仅仅是这篇文章没出现而已。所以为了让这程序越来越好,我们需要添加一些标签处理的方法。

<blockquote>标签

Blockquote代表着引用,比如文章引用的哪句话,抄了哪些文献的句子,都用这个标签。为了和正文区别,我将字体大小设置为9默认颜色(100,100,100) 

  1. def blockquote(self, label):  
  2.     "定义一个摘自另一个源的块引用"  
  3.     p = self.doc.add_paragraph('')  
  4.     p.style.font.size = Pt(9)  
  5.     for i in label:  
  6.         self.transit(i,p,(100,100,100),False) 

<iframe>标签

iframe标签出现代表着这篇微信热文嵌入了一个视频。 

  1. def iframe(self, label, p):  
  2.     t = '\n' + '*' * 20 + '\n一个视频\n链接是:%s\n' % label.attrs['src'] + '*' * 20 + '\n'  
  3.     r = p.add_run(t)  
  4.     r.font.size = Pt(10)  
  5.     print('发现一个视频,文档只能留下链接') 

<ul>和<ol>标签

出现ul和ol是列举,比如列举1.…… 2.……,有两套方法,如果ul和ol是在<p>标签内,那么需要将它写在这个段落里面,使用ul,如果单独出现,使用ul2。 

  1. def ul(self, label, p):  
  2.     "零个或更多个 <li> 元素,可以混合使用 <ol> 与<ul> 元素。"  
  3.     lis = label.findAll('li')  
  4.     for i in lis:  
  5.         t = i.text  
  6.         r = p.add_run("   ★ %s\n" % t)  
  7.         r.font.size = Pt(9)  
  8. def ul2(self, label):  
  9.     p = self.doc.add_paragraph()  
  10.     lis = label.findAll('li')  
  11.     for i in lis:  
  12.         t = i.text  
  13.         r = p.add_run("● %s\n" % t)  
  14.         r.font.size = Pt(9) 

<a>标签

<a>是链接,如果微信文章出现链接,转换为Word文档需要特殊一下,加上下划线,附上链接的url 

  1. def link(self, label, p, RGB, bold):  
  2.     "就是标签a"  
  3.     r = p.add_run(label.text)  
  4.     r.font.underline = True  
  5.     r.font.color.rgb = RGBColor(0,0,139)  
  6.     r.font.bold = bold  
  7.     href=label.attrs['href']  
  8.     r=p.add_run("(%s)"%href)  
  9.     r.font.color.rgb = RGBColor(135,206,250)  
  10.     r.font.size=Pt(9)  
  11.     r.font.underline = True 

<table>标签

Table是表格,当出现这个的时候,就需要添加表格啦,这个方法只适合整齐的表格,有合并的无效 

  1. def table(self, label):  
  2.     "只适合整齐的表格,对于不整齐的(就是有合并)无效"  
  3.     pave = {'color': (0, 0, 0), 'bold': False}  
  4.     tr = label.findAll('tr')  
  5.     td = label.findAll('td')  
  6.     row = len(tr)  
  7.     col = len(td) // len(tr)  
  8.     if len(td) % len(tr) != 0:  
  9.         col += 1  
  10.     del td  
  11.     tab = self.doc.add_table(rowrows=row, colcols=col, style='Table Grid' 
  12.     for i in range(row):  
  13.         tdlb = tr[i].findAll('td')  
  14.         for j in range(col):  
  15.             td = tdlb[j]  
  16.             dqcell = tab.cell(i, j)  
  17.             p = dqcell.paragraphs[0]  
  18.             for nr in td:  
  19.                 if nr.name == 'p':  
  20.                     for nrr in nr:  
  21.                         self.transit(nrr, p, (0, 0, 0), False)  
  22.                 else:  
  23.                     self.transit(nr, p, (0, 0, 0), False) 

<pre>和<code>标签

Pre标签和code经常出现在一起,如果pre内含code,那么就是代码行了,交给code函数,如果pre单独出现,直接按照段落处理。Code处理,就是将文字,啊不是,是将代码框入到一个表格中,文字大小9,以示区别。 

  1. def pre(self,label):  
  2.     "pre分两种情况考虑,内嵌代码行和普通pre"  
  3.     code = label.findAll('code')  
  4.     if code:  
  5.         for i in code:  
  6.             self.code(i)  
  7.     else:  
  8.         self.para(label)  
  9. def code(self, label):  
  10.     "特殊标签,用于代码行"  
  11.     RGB = (0, 0, 0)  
  12.     bold = False  
  13.     tab = self.doc.add_table(rows=1cols=1style='Table Grid' 
  14.     p = tab.cell(0, 0).paragraphs[0]  
  15.     p.style.font.size = Pt(10)  
  16.     for i in label:  
  17.         if i.name == 'br':  
  18.             p.add_run('\n')  
  19.         elif i.name == 'span':  
  20.             self.span(i, p, RGB, bold)  
  21.         elif i.name == None:  
  22.             p.add_run(str(i)) 

加上了其他标签处理方法,那么我们需要将section、transit和main主函数修改一下了,加上对应的标签处理语句。

5、总结

1.  对于图像,gif动图导入Word文档后不会播放

2.  标签分类如下

核心标签:<p>,<strong>,<section>,<img>,<span>,<h1>,<h2>,<h3>……(这些标签可以用head方法处理)

其他标签:<blockquote>,<iframe>,<ul>和<ol>,<a>,<table>,<pre>,<code>……

忽略标签:<br>,<hr>,<mpcpc>(微信广告投放点),<center>,<svg>

3.  编写其他标签函数,如果你觉得新的标签方法需要增加,只需要加入新的标签方法,并且在transit和section以及main中加入它即可

4.  个性化设置你觉得合理的标签方法,只需改动标签方法源代码即可 

 

责任编辑:庞桂玉 来源: 恋习Python
相关推荐

2020-05-29 18:00:41

Python微信阅读代码

2020-09-24 14:40:55

Python 开发编程语言

2021-04-17 23:10:59

Python微软Word

2020-04-21 10:45:47

PythonWordExcel

2021-03-02 09:05:13

Python

2020-05-11 10:59:02

2020-11-11 17:00:02

PythonOffice文件PDF

2021-12-14 07:40:08

2012-07-27 10:27:19

同话题下的热门内容

超全!Python图形界面框架PyQt5使用指南!太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Python居然被用来开发游戏了?盘点你想不到的Python开发场景浅谈Python+requests+pytest接口自动化测试框架的搭建跟着 Guava 学 Java 之 不可变集合Python轻量级Web框架:Bottle库!用 Taichi 加速 Python:提速 100+ 倍!实战 | 如何用 Python 自动化监控文件夹完成服务部署!

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号