文章目录

  • 遇到的问题
  • 初始需要处理的文本
  • 搜索和替换的一些常用正则表达式
  • python3中使用beautifulsoup4
    • beautifulsoup4是什么?
    • 安装beautifulsoup4
    • 开始使用beautifulsoup4
  • 其他的一些小细节
    • python3中将list合并转为string
  • 最终的代码(python3)
  • 参考资料

我的博客地址:https://hxd.red
原文链接:https://hxd.red/2019/08/06/python3-beautifulsoup4-html-190805/
我的微信公众号:不淡定的实验室(hxdred)

遇到的问题

在制作第三个微信小程序“法语背单词记忆小助手”时,我需要处理大量单词有关的数据,为了一劳永逸解决单词释义、单词例句等种种方面的问题,我打算提取mdx词典数据,将词典里面所有单词的数据做成数据表,并上传至云开发。这样的话,另一个小程序“法语动词变位记忆小助手”也能共享成果。

作为一个懒人,肯定不会手动去处理这么多数据(提取mdx之后有60万行数据,去除对我来说没用的动词变位数据,还有15万行,共计12000余个单词)。所以打算使用python和Beautiful Soup(以下可能简称BS)进行数据处理。引用官方文档的说法:Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航、查找,修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间。

初始需要处理的文本

初始文本如下,下面仅选取两个单词的详情页作为示例:

<zidingyi>
abandonner
<h1 class="Adresse" >abandonner</h1><br /><span class="CategorieGrammaticale" >verbe transitif </span><br />
<span class="Indicateur">(déserter) </span><br />
<div class="Traductionchinois" >擅离</div>
<span class="Locution2" id="48" >abandonner son poste</span>
<div class="Traduction2chinois" >擅离职守</div Traduction2>
</td></tr></table>
<span class="Indicateur">(laisser) </span><br />
<div class="Traductionchinois" >抛弃</div>
<span class="Locution2" id="49" >abandonner un animal</span>
<div class="Traduction2chinois" >丢弃一只动物</div Traduction2><span class="Locution2" id="50" >partir en abandonnant femme et enfants</span>
<div class="Traduction2chinois" >抛弃妻子和孩子出走</div Traduction2>
</td></tr></table>
<span class="Indicateur">(renoncer à) </span><br />
<div class="Traductionchinois" >放弃</div>
<span class="Locution2" id="51" >abandonner ses études</span>
<div class="Traduction2chinois" >放弃自己的学业</div Traduction2>
</td></tr></table>
<span class="Indicateur">(se retirer de) </span><br />
<div class="Traductionchinois" >弃权</div>
<span class="Locution2" id="52" >il a abandonné la course</span> <span class="Traduction2chinois" >他在这次赛跑中弃权</span></td></tr></table>
<br /><br /> <h1 class="Adresse" >abandonner</h1><br /><span class="CategorieGrammaticale" >verbe intransitif </span><br />
<div class="Traductionchinois" >退出比赛</div>
<span class="Locution2" id="53" >après sa chute, le cycliste a abandonné</span> <span class="Traduction2chinois" >这个自行车运动员摔倒后就退出了比赛</span>
</zidingyi>
<zidingyi>
abat-jour
<h1 class="Adresse" >abat-jour</h1>
<br /><span class="CategorieGrammaticale" >nom masculin invariable</span><br />
<div class="Traductionchinois" >灯罩</div>
</zidingyi>

搜索和替换的一些常用正则表达式

在最原始的文档中,有非常多无用 的标签,需要将这些标签删除。如果这些标签是定值,那么直接就能用普通的搜索替换就行批量替换;但若是标签中有有规律变动的id或者是标签之间的文字有所变动时,就需要使用正则表达式进行查找。在使用过程中,最常用的表达式总结一些就是这样的:

<a[^>]*>(.*?)</a>

举例如下:<span class=”Traduction_py”>之间有不规则的文字内容,但是我需要将所有<span class=”Traduction_py”></span Traduction_py>和标签之间文字一起替换掉,例如下方的第一行:<span class=”Locution2″ id=”12″>标签中存在id号,但是我需要将所有的类似标签(不同id)全部替换掉,例如下方的第二行:

<span class="Traduction_py">(.*?)</span Traduction_py>
<span class="Locution2" [^>]*>

python3中使用beautifulsoup4

beautifulsoup4是什么?

引用官方文档的说法:Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航、查找,修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间。

安装beautifulsoup4

从这部分开始就需要使用到python了,至于如何方便快捷地0基础使用上python?这里可能会单独放一篇文章介绍,先立一个flag。用简洁地话来说,需要配备一下几点:

  • 先下载一个Anaconda(搜索即可,傻瓜安装)
  • 装完之后搜索所安装的软件里有:Anaconda Prompt。打开。
  • 输入下面代码即可安装完成beautifulsoup4
$ pip install beautifulsoup4
  • 搜索所安装的软件:Anaconda Navigator,选择Spyder,把本文的代码修改一下贴上即可运行。

开始使用beautifulsoup4

首先我们需要打开html文件,告诉程序你的文件存在什么地方。在path中需要将你的文件路径修改成自己的。html文件怎么来?参照“初始需要处理的文本”,将代码保存在Notepad++中另存为html即可开始实验。接下来两行就是打开html文件并且读取其中的内容。

path = 'D:/WORKS/larousse_original_test1.html'htmlfile = open(path, 'r', encoding='utf-8')htmlhandle = htmlfile.read()

下一步就是调用Beautifulsoup解析功能,解析器使用lxml。并且使用python中的panda包来存储目标数据。注意此处BeautifulSoup的大小写,不然会报错。

from bs4 import BeautifulSoupsoup = BeautifulSoup(htmlhandle, 'lxml')import pandas as pd

创建一个计数的,然后创建result,之后的所有的数据都存在这里面,到时候打开excel表时就可以看到‘word’、‘word_cixing’等等的列,而数据正是随着这些列进行逐行增加的。

count = 0result = pd.DataFrame({},index=[0])result['word'] = ''result['word_cixing'] = ''result['word_jieshi_fr'] = ''result['word_jieshi_cn'] = ''result['word_liju_fr'] = ''result['word_liju_cn'] = ''new = result

在这里建立一个循环。再初始html中我将原来mdx中的</>替换成了<zidingyi></zidingyi>。也就是说每一个单词的最外面罩着<zidingyi></zidingyi>,每一个<zidingyi></zidingyi>里面就是该单词的所有内容。

首先用了find_all()命令,这样就能得到所有的<zidingyi></zidingyi>标签的内容,并用循环遍历。每一次读到的内容存储在item里面,再通过BS的CSS选择器选择了标签为h1的内容,这是单词本身。接下来,需要将读到的list转化为string,这个在下节会讲到。

BeautifulSoup 对象表示的是一个文档的全部内容.。大部分时候可以把它当作 Tag 对象,它支持遍历文档树和搜索文档树 中描述的大部分的方法。再使用get_text(),将所有标签之内的所有内容读出,储存到new的“word”字段里面,并且拼接到result中,为最后的文档输出做好准备。

这里只举了“word”一个例子,不同的字段对应着不同的样式或者是标签,可以从BS的官方中文文档中寻找详细信息。

for item in soup.find_all('zidingyi'):word = item.select("zidingyi > h1")word = ';'.join(str(e) for e in word)word = BeautifulSoup(word).get_text()new['word'] = wordcount += 1result = result.append(new,ignore_index=True)

最后大功告成,将所有的数据保存到excel表格中。(具体路径和excel命名可以根据自己的实际需求改写)

result.to_excel('d:result.xlsx')

其他的一些小细节

python3中将list合并转为string

使用 ‘’.join,引号内可以加上相应的分隔符

list1 = ['1', '2', '3']
str1 = ''.join(list1)

如果list是数字类型或者不是string类型,那需要在join之前转换。

list1 = [1, 2, 3]
str1 = ''.join(str(e) for e in list1)

最终的代码(python3)

-*- coding: utf-8 -*-
"""
Created on Sun Aug  4 14:13:54 2019
@author: https://hxd.red
"""
path = 'D:/WORKS/larousse_original_test1.html'
htmlfile = open(path, 'r', encoding='utf-8')
htmlhandle = htmlfile.read()
from bs4 import BeautifulSoup
soup = BeautifulSoup(htmlhandle, 'lxml')
import pandas as pd
count = 0
result = pd.DataFrame({},index=[0])
result['word'] = ''
result['word_cixing'] = ''
result['word_jieshi_fr'] = ''
result['word_jieshi_cn'] = ''
result['word_liju_fr'] = ''
result['word_liju_cn'] = ''
new = result
for item in soup.find_all('zidingyi'):print(item)word = item.select("zidingyi > h1")word = ';'.join(str(e) for e in word)print(word)word_cixing = item.select(".CategorieGrammaticale")word_cixing = ';'.join(str(e) for e in word_cixing)print(word_cixing)word_jieshi_fr = item.select(".Indicateur")word_jieshi_fr = ';'.join(str(e) for e in word_jieshi_fr)print(word_jieshi_fr)word_jieshi_cn = item.select(".Traductionchinois")word_jieshi_cn = ';'.join(str(e) for e in word_jieshi_cn)print(word_jieshi_cn)word_liju_fr = item.select(".Locution2")word_liju_fr = ';'.join(str(e) for e in word_liju_fr)print(word_liju_fr)word_liju_cn = item.select(".Traduction2chinois")word_liju_cn = ';'.join(str(e) for e in word_liju_cn)print(word_liju_cn)word = BeautifulSoup(word).get_text()word_cixing = BeautifulSoup(word_cixing).get_text()word_jieshi_fr = BeautifulSoup(word_jieshi_fr).get_text()word_jieshi_cn = BeautifulSoup(word_jieshi_cn).get_text()word_liju_fr = BeautifulSoup(word_liju_fr).get_text()word_liju_cn = BeautifulSoup(word_liju_cn).get_text()new['word'] = wordnew['word_cixing'] = word_cixingnew['word_jieshi_fr'] = word_jieshi_frnew['word_jieshi_cn'] = word_jieshi_cnnew['word_liju_fr'] = word_liju_frnew['word_liju_cn'] = word_liju_cncount += 1result = result.append(new,ignore_index=True)
result.to_excel('d:result.xlsx')

参考资料

  1. https://stackoverflow.com/questions/5618878/how-to-convert-list-to-string
  2. https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#contents-children
  3. https://blog.csdn.net/fwj_ntu/article/details/78843872

使用Python3和BeautifulSoup4处理本地html文件相关推荐

  1. python博客下载本地文件_解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了...

    1.今天网上下载一个博客项目,发现本地访问,js,css加载不了. 我想应该是项目上线的安全措施,但是我想调试项目.找到方法如下 在settings.py里面编辑 添加 STATICFILES_DIR ...

  2. python怎么保存文件视频教程_python3将视频流保存为本地视频文件

    使用python3+opencv3.3.1环境将视频流保存为本地视频文件,具体内容如下 1.利用opencv中的VideoCapture类获取视频流的链接,通过cv2的方法得到该视频流的帧数和每帧大小 ...

  3. python stl文件_打开本地STL文件并创建webgl使用的geometry

    需求 打开本地STL文件 一个独立基于webgl的viewer,会被别的网站重用 将打开文件的数据传输给viewer,并且在文件加载的时候显示进度条 解决方案 #1可以使用传统的html5 api来打 ...

  4. python 保存视频流_python3将视频流保存为本地视频文件

    使用python3+opencv3.3.1环境将视频流保存为本地视频文件,具体内容如下 1.利用opencv中的VideoCapture类获取视频流的链接,通过cv2的方法得到该视频流的帧数和每帧大小 ...

  5. Python调用OpenCV接口播放本地视频文件、本地和网络摄像头

    1 前言 上篇文章介绍了在WIN10系统上, C++调用OpenCV接口,播放本地视频文件.本地和网络摄像头视频.本篇我们来看一下,Python如何调用OpenCV接口,做同样的事情. 序号 视频来源 ...

  6. python爬虫入门练习:BeautifulSoup爬取猫眼电影TOP100排行榜,pandas保存本地excel文件

    传送门:[python爬虫入门练习]正则表达式爬取猫眼电影TOP100排行榜,openpyxl保存本地excel文件 对于上文使用的正则表达式匹配网页内容,的确是有些许麻烦,替换出现任何的差错都会导致 ...

  7. Echarts读取本地json文件渲染轨迹,亲测ok

    Echarts读取本地json文件渲染轨迹,亲测ok 1. 报错及解决 2. 效果图 3. 源码lines-track.html如下 参考 1. 报错及解决 报错:由于浏览器的同源策略 已拦截跨源请求 ...

  8. android读取xml 字符串,Android 读取本地Xml文件,并转换成String

    问题 不是解析本地 xml 文件, 而是要将 xml 文件中的所有内容(包含格式,标签等),直接转换成 String. 与前端H5页面交互时, iOS 在请求远程 xml 文件耗时太长(有时需要4~5 ...

  9. uiwebview 读取本地html,UIWebView加载本地HTML文件

    一.准备HTML文件及其资源文件 使用UIWebView加载本地的HTML文件 index.html,在index.html中引用了本地的图片.CSS文件.JS文件以及外部的图片. index.htm ...

最新文章

  1. 实现第一个自定义nginx模块
  2. 设置PLSQ 连接oracle数据库
  3. 计算机mac地址里面0,如何查计算机MAC地址
  4. Think Python - Chapter 12 Tuples
  5. 无法安装.msi文件
  6. 家用笔记本电脑什么牌子好_南阳家用小型电梯什么牌子好
  7. 每日一水:HDOJ 1408 盐水的故事
  8. fckeditor编辑器自定义加按钮菜单
  9. Memcached学习一:Memcached安装使用
  10. IPC 进程间通信方式——管道
  11. vmware esxi主机经常出现的警示“vsphere distributed switch mtu支持状态, vlan中继状态”求大神回复。
  12. shiro filter
  13. linux junit
  14. Winform基于UnityWebplayer封装用户控件以实现.unity3d文件相对路径(动态src)
  15. java的安装_java 安装步骤
  16. 【如何制作电子书】云展网教程 | 编辑纯文本阅读页面功能(有利于SEO收录)
  17. unity2018关联不到vs_Unity2018 VS2017打开CS脚本,提示全红及无法加载工程等问题解决...
  18. 计算机中心pdca,信息中心日常运维工作PDCA持续改进.docx
  19. Mybatis使用choose when
  20. git 账号密码重置

热门文章

  1. 美国的美元霸权·《看懂世界格局的第一本书·2》
  2. CentOS自定义安装光盘制作-kickstart用cdrom做源
  3. 电子商务竞争加速:顺丰速运及天极均推B2C平台
  4. 详解js对称加密和非对称加密
  5. 15_Pandas计算元素的数量和频率(出现的次数)
  6. OpenCV计算机视觉编程攻略第2版pdf
  7. 单机魔兽世界服务器显示不兼容,官网公告:解决登陆游戏设备驱动不兼容问题...
  8. 慎独的修炼之道--群处守嘴 独处守心 修以清心为主 涉世及慎言为先
  9. OpenSSL与CA认证
  10. 蓝牙耳机打电话外放?目前通话效果最好的蓝牙耳机