於心怡的作业二

代码


  import requests
  from bs4 import BeautifulSoup
  import re

  x = requests.get('http://www.jxufe.edu.cn/')
  html = x.text
  f = open('jxufeedu.html','w',encoding='utf-8')
  f.write(html)
  f.close()

  #方法一 使用 BeautifulSoup模块中的get_text()函数直接收集所有tag中包含的文本内容
  soup = BeautifulSoup(html)
  text = soup.get_text()
  text = re.sub('\n{2,}','\n',text) #为了美观 将2个及以上的换行符换为1个
  text_final = text.replace('\n','')

  #方法二 使用正则表达式匹配
  p = re.compile('<.*?>(.*)<.*?>')
  html = re.sub('','',html)
  txt = p.findall(html)
  txt = [item for item in txt if len(item) !=0] #去掉列表里的空元素

  p2 = re.compile('<a.*?>(.*?)</a.*?>') #观察txt变量里的内容,发现只剩<a>标签里的内容还未提取
  txt1 = [p2.findall(item) for item in txt ]  #实际上这一步可以省去,因为当只剩一对标签不含嵌套时,直接将txt列表内容转成字符串后用替换的方法删除标签即可。

  jxufe = ''
  for i in range(len(txt)):
      if txt1[i] == []:
          jxufe +=str(txt[i])+'\n'
      else:
          jxufe +=str(txt1[i])+'\n'

  jxufe1 = re.sub("\[|'|\]|<.*?>",'',jxufe) #替换掉列表的中括号和引号,以及所有html标签内容
  jxufe2 = jxufe1.replace(' ',' ')
  jxufe2 = re.sub('\n{2,}','\n',jxufe2) #为了美观 将2个及以上的换行符换为1个
  jxufe_final = jxufe2.replace('\n','') #便于结果截图,将换行符替换为空

结果预览(换行版)

江西财经大学
考生  |
在校生  |
教职工  |
社会人士  |
校友
原站主页
ENGLISH
全站检索
校情总揽
学校简介
图解江财
历史沿革
现任领导
历任领导
学校导图
文化标识
校园风光
数据江财>
学科一览
博士点一览
硕士点一览
专业学位点一览
专业一览
师资队伍
教师个人主页
机构设置
学院设置
管理机构
科研机构
教学科研
科研管理
当代财经
博士后流动站
教务信息网
本科教学评估
科研讲座信息
国际交流
对外合作交流
国际文化交流中心
国际化信息系统
来华留学招生
招生就业
博士后招收
博士研究生
硕士研究生
本科招生
国际本科招生
继续教育
就业工作
留学江财
数字校园
智慧江财
新OA系统
图书资源
信息门户
校园全景地图
选课平台
网络教学平台
教工邮箱
网络服务
网络报修
综治平台
本科教学评教系统
vpn服务
江财云盘
图书资源
人才招聘
筑牢校园疫情防线,确保校园安全稳定
一图读懂江西财经大学“十四五”规划
大美江财
春暖花开
春暖花开
江财新闻
基层风采
通知公告
MORE+
MORE+
MORE+
让党旗在疫情防控一线高高飘扬的倡议书
学校召开推进创新创业教育高质量发展工作征求意见座谈会2022-04-29
踏实笃行,金融学院稳步推进“大财商”教育2022-04-29
江西财经大学加拿大校友会在多伦多正式成立2022-04-29
绽放在抗疫一线的财税学院“铿锵玫瑰”2022-04-29
国际经贸学院:扛好三面旗帜,树起三种形象2022-04-29
【学在江财】邓皓天:皓志明才,圆梦燕园2022-04-29
【线上教学案例】精心准备,从容应对2022-04-29
“映山红”研支团线上学习习近平总书记重要讲话精神2022-04-28
校领导到三家单位调研指导2022-04-28
视频江财
MORE+
师生风采
MORE+
专题专栏
MORE+
学术江财
MORE+
媒体江财
MORE+
信息公开
新OA系统
映山红网
网络投稿
后勤网上报修
科研讲座信息
纪委网络举报
干部在线学习
师德师风举报
"三下乡"专题
校领导邮箱
蛟桥园校区:江西省南昌市昌北国家经济技术开发区双港东大街169号 邮编:330013 青山园校区:南昌市青山南路596号 邮编:330077
麦庐园校区:江西省南昌市昌北国家经济技术开发区玉屏大道 邮编:330032 枫林园地址:江西省南昌市昌北国家经济技术开发区枫林大道632号 邮编:330013
关闭

结果

结果截图

解释

使用BeautifulSoup模块可以快速便捷地提取出所有标签内的文字内容。所以这里主要解释正则表达式匹配法。
匹配时使用的pattern为"<.*?>(.*)<.*?>",注意括号内使用的是贪婪匹配。因为对于( )前后都是任意标签时,

形如"<li> <a> XXX </a></li>"的字段就无法匹配成功
比如:

示例截图

通过观察变量窗口,可以看到两种方法的结果大小分别为jxufe_final:941(re法)和text_final:938(BeatuifulSoup法)。
仔细比对后发现:相比BeautifulSoup匹配的结果,使用正则表达式提取出的结果多出了了“旧OA系统”字符串,通过查看网页源码发现,这是匹配到了注释里的内容。

(在正式开始匹配前先re.sub('<!--.*?-->','',html)可解)

变量截图
变量截图

变量jxufe_final(re法)减去“旧OA系统”后长度为936,比变量text_final(BeatuifulSoup法)长度仍少2。
通过直接查看text_final变量在内存里的内容,可以看到有 "\ufeff\ufeff" "\xa0\xa0|" 字样的特殊字符,相关知识可以查看这篇网页。↓
特殊字符:\ufeff、\xa0、\u3000 处理方法

示例截图

可知2长度的差异是由text_final里有两个字节顺序标记"\ufeff"导致的。

综上,使用BeautifulSoup模块中的get_text()函数方便快捷,并且不会提取到注释里的内容。但是解析下来的内容会包含特殊字符,不过一般不影响阅读。有强迫症的同学可以通过replece(u'特殊字符','')对特殊字符进行消除。XD
使用正则表达式则比较麻烦,但是更加锻炼能力,并且可以拓展应用于其他场景。


附:优化后的代码及结果

结果截图 结果截图