目录:

  • 前言
  • 编码演变历史
    • 1 Charset Character Encoding
    • 2 ASCII字符集与编码
    • 3 中文字符集与编码
    • 4 大一统的Unicode
    • 5 UTF-8编码
    • 6 Python中的编码
  • 正则表达式
  • BeautifulSoup4库的使用
  • 相关文章阅读

1.前言

  • 事务管理类app的项目,需要后台导入某工学生的个人课表,选择用python抓取并解析HTML的方式
  • 如果习惯了实战一遍、优先解决问题,再去学习技术细节,那本文应该对你有所帮助,因为我就是这样干的
  • 本篇文章记录 解析HTML 获取课程内容的部分,知识点包括:
    • 编码演变的历史
    • 正则表达式
    • BeautifulSoup4库的使用
  • 登录系统并抓取HTML页面参见: python爬虫之urllib登录抓取HTML页面
  • GitHub下载地址:Python源码与解析的HTML文件

2.编码演变历史

为了弄清下面几个问题,需要对编码演变的历史做必要的介绍,更详细介绍可以在本文的参考资料中查看

  • 为什么UTF-8格式的代码,跨平台复制粘贴,有时会出现中文注释乱码,甚至没有中文代码也无法正常运行,在转成GB2312或者Unicode就搞定
  • 做正则匹配时,错误的编码格式会导致中文匹配失败
  • BeautifulSoup的构造函数应选择哪种编码

2.1 Charset & Character Encoding

  • 字符(Character):是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等
  • 字符集(Charset):是多个字符的集合,每个字符集包含字符个数不同,常见字符集有ASCII,GB2312,BIG5,Unicoede,UTF-8等
  • 字符编码(Character Encoding):为了让计算机能够识别和存储字符集所使用的法则,使字符集和数字系统建立对应关系
    下面按发展史简要介绍几种主要字符集及其编码

2.2 ASCII字符集与编码

  • ASCII字符集:包括控制字符(回车,换行等),可显示字符(英文字符,阿拉伯数字等)
  • ASCII编码:将ASCII字符集转换为计算机可存储计算的数的规则,
  • 特点:这是较早出现、现今最通用的单字节编码,即8 bits表示一个字符.举例,查ASCII码对照表知,a的ASCII码值为97(十进制),二进制表示为01100001(占用一字节)
  • 缺点:显然ASCII能显示的字符仅限于英语,扩展后的ASCII也只解决了部分西欧语言的显示,Macbook就放弃了ASCII而采用后面提到的Unicode

2.3 中文字符集与编码

  • 中国用上了计算机之后,当然要为中文做一套计算机编码规则,采用多字节编码,即每个字符由1个、2个或4个字节变长编码表示
  • GB2312:中国国家标准简体中文字符集,GB2312简体中文编码表,GBK包含GB2312,GB18030包含GBK,增加了一些罕见汉字
  • BIG5:繁体中文集

2.4 大一统的Unicode

  • 各个国家的文字都有一套自己的编码,乱成一锅粥是多么可怕的一件事情。因此Unicode字符集与编码就应运而生
  • Unicode是基于通用字符集UCS(Universal Character Set)发展而来,是计算机可以显示世界上数十种文字

2.5 UTF-8编码

  • UTF-8是针对Unicode的变长字符编码,注意UTF-8不是字符集,是一种编码
  • 优点:变长编码可以提高了编码效率。通俗的说,传输相同文字内容时,UTF-8编码比Unicode原先的编码方式(等长编码)使用较少的码字

2.6 Python中的编码

在python2.7中,有unicode类型

str_unicode = u'测试' #显示定义unicode类型变量
str_gb = str_unicode.encode('gb2312') #将unicode对象以gb2312编码
str_utf = str_unicode.encode('utf-8') #将unicode对象以utf-8编码
str_origin = str_gb.decode('gb2312') #将gb2312编码的字符串解码获取unicode

在python3中,取消了unicode类型,取而代之的是:使用unicode字符的字符串类型str。编码前是字符串类型str,编码后是字节流类类型bytes。

str_unicode = '测试' #字符串类型变量,使用unicode字符
str_gb = str_unicode.encode('gb2312') #将字符串类型对象以gb2312编码为bytes类型对象
str_origin = str_gb.decode('gb2312') #将gb2312编码的字符串解码,获取字符串类型对象

3.正则表达式

此处只说明本项目中用到的几个正则匹配规则,更多正则知识参见python正则表达式对照表,当字典查就行

#匹配连续的多个中文字符,这是unicode编码的中文范围
ur"[\u4e00-\u9fa5]+"
#在py2.7下,可如下形式调用,被正则内容必须为unicode编码,否则应decode
re.match(ur"[\u4e00-\u9fa5]+",u"搞笑le")
re.match(ur"[\u4e00-\u9fa5]+",str_utf.decode('utf-8'))#匹配课表中两种表示上课时间的方式,#吐槽一下我工的课表真不统一,unicode编码
#第1种:周一第3,4节{第8-16周}
#第2种:第8-14周|2节/周
ur"第\d+-\d+周\|\d节\/周|周[一二三四五六日]第[,\d]+节{第[-\d]+周[\|单双周]*}"r">第\d+节</td>" #匹配第n节,utf-8编码# [] 用来指定一个字符集 [abc] 表示 abc其中任意一个字符符合都可以
# - 表示范围
# \d 匹配一个数字字符。等价于[0-9]
# + 表示将其前面的字符重复1或者多次
# {} 可以表示范围 

4.BeautifulSoup4库的使用

  • Beautiful Soup4 官方文档,安装、使用、对象类型、遍历文档树一应俱全。相信我,快速浏览一下 当字典用 就行了
  • 下面按本项目parserCourse.py中,对bs4语句的使用顺序做介绍,用过一遍知道 使用流程,就知道该怎么查了
  • 建议在 前言 的GitHub源码链接中下载parserCourse.py和待解析的html文件,如果对你有帮助,就请给个star吧
from bs4 import BeautifulSoup #记得pip install beautifulsoup4#第一步:创建beautifulsoup对象
#构造第1个参数是待解析的内容,第2参数指定使用python标准库解析器
#文档会被转成unicode编码
htmlPage = open("./formatCourse.html")
soup = BeautifulSoup(htmlPage, "html.parser")#第二步:定位,找到id为Table1的table标签,就是这份html中包含课程内容的部分
#find函数返回'bs4.element.Tag'对象,bs4有4种对象(往下看先)
#此处返回了<table></table>标签内的所有内容
tagTable = soup.find('table', id='Table1')#第三步:按<tr></tr>标签分割课表,并以list输出
tbodyContents = tagTable.tbody.contents
# 1)element.Tag的用法,获取<table>标签下的<tbody>标签及其内容
tabTable.tbody # 依然返回element.Tag对象
# 2)遍历文档树的知识点:.contents属性将Tag的子节点以列表的方式输出
tagTable.tbody.contents # 将<tbody>的内容(子节点)以list输出
# 3)过滤:list中有一些换行符需要过滤掉,只保留Tag类型的元素,即由<tr></tr>构成的元素
tbodyContents = filter(lambda x: type(x) == element.Tag, tbodyContents)#第四步:构造好匹配课程名、上课时间、教师姓名、教室的正则表达式后
#按照每个<tr></tr>进行遍历,前两个元素是无用的略过
for lessonN in xrange(2, len(tbodyContents)):
#类似第三步分割过滤出<td></td>之后,遍历每行正则出课程信息
trContent = filter(lambda x: type(x) == element.Tag,tbodyContents[lessonN].contents)
trContent[rowN].text #表示取tr标签中的字符#剩下的部分是遍历并正则匹配出课程信息,看注释就能看懂,不赘述。
#注意:正则匹配时,不确定字符串是什么编码,最好显示的转换一下

5.相关文章阅读

python正则表达式对照表
python爬虫之urllib登录抓取HTML页面

参考:

吴秦:字符集和字符编码
Beautiful Soup4 官方文档

如果对你有所帮助,就请点个赞吧 (^-^)

Python爬虫之正则 BeautifulSoup4解析HTML相关推荐

  1. python爬虫详细步骤-Python爬虫的两套解析方法和四种爬虫实现过程

    对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式.因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门.本文想针对某一网页对 python 基础 ...

  2. Python爬虫怎么挣钱?解析Python爬虫赚钱方式,轻轻松松月入两万,再也不用为钱发愁啦

    Python爬虫怎么挣钱?解析Python爬虫赚钱方式,想通过自己学到的专业技能赚钱,首先需要掌握Python爬虫技术,专业能力强才能解决开发过程中出现的问题,可以通过Python爬虫外包项目.整合信 ...

  3. Python爬虫怎么挣钱?解析Python爬虫赚钱方式

    Python爬虫怎么挣钱?解析Python爬虫赚钱方式,想过自己学到的专业技能赚钱,首先需要你能够数量掌握Python爬虫技术,专业能力强才能解决开发过程中出现的问题,Python爬虫可以通过Pyth ...

  4. python爬虫之创建和解析xlm文件

    python爬虫之创建和解析xlm文件: 1.python代码创建xlm字符串(使用xml库方法): import xml.etree.ElementTree as ET bookstore = ET ...

  5. python爬虫用途-Python爬虫入门知识:解析数据篇

    首先,让我们回顾一下入门Python爬虫的四个步骤吧: 而解析数据,其用途就是在爬虫过程中将服务器返回的HTML源代码转换为我们能读懂的格式.那么,接下来就正式进入到解析数据篇的内容啦. Part 1 ...

  6. 【Python基础】Python爬虫的两套解析方法和四种信息提取方式

    Python爬虫 Author:Iouwill Machine Learning Lab 分享一篇往日旧文章,非常实用. 对于大多数朋友而言,爬虫绝对是学习python的最好的起手和入门方式.因为爬虫 ...

  7. Python爬虫实战之xpath解析

    XPath 是一门在 XML 文档中查找信息的语言,最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索. 所以在Python爬虫中,我们经常使用xpath解析这种高效便捷的方式来提 ...

  8. Python爬虫怎么挣钱?解析Python爬虫赚钱新方式

    想要通过自己学到的专业技能赚钱,首先需要你能够数量掌握Python爬虫技术,专业能力强才能解决开发过程中出现的问题,Python爬虫可以通过Python爬虫外包项目.整合信息数据做产品.独立的自媒体三 ...

  9. Python爬虫(十二)_BeautifulSoup4 解析器

    CSS选择器:BeautifulSoup4 和lxml一样,Beautiful Soup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML数据. lxml只会局部遍历,而B ...

最新文章

  1. python3和pip3安装和问题解决
  2. 有关项目实施【老男孩】的经验分享
  3. 【STM32】硬件随机数程序示例
  4. synchronized的一些记录
  5. linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史
  6. activemq 开启监听_SpringBoot集成ActiveMQ怎么实现Topic发布/订阅模式通信?
  7. 死锁的处理策略——避免死锁
  8. JS表单学习笔记(思维导图)
  9. JS实现改变复选框选中行中指定单元格背景色(状态改变事件)
  10. 平板边界层内的流速分布实验
  11. c语言中各个符号的意义及作用是什么,C语言各类符号意义以及用法是什么?
  12. 基于JAVA大众点评管理系统计算机毕业设计源码+系统+lw文档+部署
  13. Could not clean server of obsolete
  14. 深信服EDR任意用户登录漏洞复现
  15. 四川大学计算机学院男女生比例,2019年四川各大高校男女比例排行,电子科技大学4比1...
  16. Qt窗口组件实现动态背景功能
  17. GK309协议电子工牌数据模拟器+Socket数据发送 JAVA版-源码
  18. 计算机所有以太网适配的ip,演示win10电脑以太网没有有效的ip配置
  19. 撸免费的oracle cloud服务器并使用脚本自动化部署云服务器
  20. LAMP环境部署及搭建网校系统

热门文章

  1. 防止网络攻击的10大网络安全措施
  2. 软件测试人员必备的32个网站清单,果断收藏了!
  3. 【转】冥想的习练与方法(初级篇)
  4. FIAR应收账款【07相关报表】
  5. 工业级宽温版RK3399K核心板发布
  6. 关于戴尔笔记本电脑操作中突然卡死初始化存储,自我检查然后卡兹一声的解决方法
  7. Power AI:堪称机器学习的“破壁人”
  8. Tapdata PDK 生态共建计划启动 MongoDB、Doris、OceanBase、PolarDB等十余家厂商首批加入
  9. 基于STM32的DAC音频输出
  10. opencv invert()函数使用问题记录