目录:
为了弄清下面几个问题,需要对编码演变的历史做必要的介绍,更详细介绍可以在本文的参考资料中查看
在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编码的字符串解码,获取字符串类型对象
此处只说明本项目中用到的几个正则匹配规则,更多正则知识参见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+节" #匹配第n节,utf-8编码
# [] 用来指定一个字符集 [abc] 表示 abc其中任意一个字符符合都可以
# - 表示范围
# \d 匹配一个数字字符。等价于[0-9]
# + 表示将其前面的字符重复1或者多次
# {} 可以表示范围
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种对象(往下看先)
#此处返回了
标签内的所有内容
tagTable = soup.find('table', id='Table1')
#第三步:按 标签分割课表,并以list输出
tbodyContents = tagTable.tbody.contents
# 1)element.Tag的用法,获取标签下的标签及其内容
tabTable.tbody # 依然返回element.Tag对象
# 2)遍历文档树的知识点:.contents属性将Tag的子节点以列表的方式输出
tagTable.tbody.contents # 将的内容(子节点)以list输出
# 3)过滤:list中有一些换行符需要过滤掉,只保留Tag类型的元素,即由 构成的元素
tbodyContents = filter(lambda x: type(x) == element.Tag, tbodyContents)
#第四步:构造好匹配课程名、上课时间、教师姓名、教室的正则表达式后
#按照每个 进行遍历,前两个元素是无用的略过
for lessonN in xrange(2, len(tbodyContents)):
#类似第三步分割过滤出 之后,遍历每行正则出课程信息
trContent = filter(lambda x: type(x) == element.Tag,tbodyContents[lessonN].contents)
trContent[rowN].text #表示取tr标签中的字符
#剩下的部分是遍历并正则匹配出课程信息,看注释就能看懂,不赘述。
#注意:正则匹配时,不确定字符串是什么编码,最好显示的转换一下
5.相关文章阅读
python正则表达式对照表
python爬虫之urllib登录抓取HTML页面
参考:
吴秦:字符集和字符编码
Beautiful Soup4 官方文档
如果对你有所帮助,就请点个赞吧 (^-^)