感兴趣内容1
感兴趣内容2
……
感兴趣内容n
import sys
import os
import os.path
from html.parser import HTMLParser
#定义HTMLParser的子类,用以复写HTMLParser中的方法
class MyHTMLParser(HTMLParser):
#构造方法,定义data数组用来存储html中的数据
def __init__(self):
HTMLParser.__init__(self)
self.data = ""
self.flag = False
#self.index = 0
#覆盖starttag方法,可以进行一些打印操作
def handle_starttag(self, tag, attrs):
#pass
#print("遇到起始标签:{} 开始处理:{}".format(tag, tag))
#if tag == "tr":
# self.index = 0
if tag == "div":
for k,v in attrs:#遍历div的所有属性以及其值
if k == "class" and v == "cell":#确定进入了
#self.index = self.index + 1
self.flag = True
self.data = self.data + """
return
#覆盖endtag方法
def handle_endtag(self, tag):
#pass
#print("遇到结束标签:{} 开始处理:{}".format(tag, tag))
if self.flag == True:
self.data = self.data + "","
self.flag = False
return
#遇到tr结束,增加一个回车
if tag == "tr":
self.data = self.data + " "
#覆盖handle_data方法,用来处理获取的html数据,这里保存在data数组
def handle_data(self, data):
#pass
#print("遇到数据:{} 开始处理:{}".format(data, data))
if(self.flag == True):
data = data.replace(" ","")#替换字段中的回车
data = data.replace(" ","")#替换字段中的连续两个空格
self.data = self.data + data
def read_file(filename):
fp = open(filename,"r",encoding="utf-8")
content = fp.read()
fp.close()
return content
def write_file(filename,content):
fp = open(filename,"a+",encoding="utf-8")
fp.write(content)
fp.close()
def main():
csv_file = "1.csv"
#会员信息
#write_file(csv_file,""序号","账号","账号状态","登录IP","最近登录时间","登录次数","上级账号","交易次数","交易流水","账号余额","姓名" ")
#资金账户信息
write_file(csv_file,""序号","卡号/账户","开户行/平台","余额","流水","所在地","姓名","用户名","手机号","qq","邮箱","注册IP","注册时间" ")
parser = MyHTMLParser()
for i in range(1,3):
html_file = "%d.html"%i
print(html_file)
if os.path.exists(html_file) == False:
print(html_file + "文件不存在!")
return
content = read_file(html_file)
#print(content)
parser.feed(content)
#对解析后的数据进行相应操作
#print(parser.data)
write_file(csv_file,parser.data)
parser.close()
main()
以个人成绩网页页面为例:
右键查看源代码:
右键另存为单独的html文件,然后代码读取并处理
import re
f = open("GP.html","r",encoding='utf-8')
html = f.read()
table = re.findall(r'<table(.*?)</table>', html, re.S)#查找html中table之间的内容
nowtable = table[0]#前两个表格为成绩信息
nowtable = nowtable.replace('\t','')#将空格换行等去除
nowtable = nowtable.replace('\n','')
nowtable = nowtable.replace(' ','')
nowtable = nowtable.replace(' ','')
td0 = re.findall(r'<tdclass="center">(.*?)</td>', nowtable, re.S)#成绩想关的信息都在tdclass="center"td之间
print("主修课程信息为:\n",td0)
nowtable = table[1]
nowtable = nowtable.replace('\t','')
nowtable = nowtable.replace('\n','')
nowtable = nowtable.replace(' ','')
nowtable = nowtable.replace(' ','')
td1 = re.findall(r'<tdclass="center">(.*?)</td>', nowtable, re.S)
print("选修课信息为:\n",td1)
print("选修课信息第一个值为:\n",td1[0])
结果:
如果想要计算GPA,字符转换为对应的数值进行计算就行了
遇到像下面的数据,里面是获取到的一些新闻资讯,但是不是以文本保存的,而是HTML。
想要直接读取HTML
import os
file_path = './data'
file_names = os.listdir(file_path)
i = 1
with open(os.path.join(file_path, file_names[i]), 'r', encoding='utf-8') as f:
txt = f.read()
得到结果如下:
'\ufeff<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>地址识别试题</title></head><body><div><h1>深度|翼装飞行是玩命?拒绝冒险,专业比赛都要“看天吃饭”</h1><h3>翼装飞行其实最早是从高空跳伞运动中产生的,一些爱好者希望实现人类自由飞翔而开始穿着翼装,然后才逐渐出现低空翼装飞行这样更加刺激的飞行形式。”根据方泽体育的介绍,翼装飞行之所以危险性高,主要源于两个原因:一是飞行速度快;二是起跳方式和飞行环境的特殊。</h3><h2>极限运动,反而最不能冒风险</h2><h3>值得一提的是,对于高空翼装跳伞,全球有相关的培训中心和机构认证,经过培训合格的人才可以拿到证书。而低空翼装飞行没有被大范围推广,并不存在相关的资格认证,那么作为赛事方,如何来评定参赛者的准入资格呢?相关人员告诉记者,低空翼装飞行这样的超极限运动非常小众,全球人数也不过600人左右,国内更是只有寥寥数人,有鉴于此,世界翼装飞行联盟会举办一个预选赛来决定参赛人选。“预选赛每年6月份在挪威举行,是从海边悬崖上定点起跳,但整体难度略低,相对安全。裁判都是翼装飞行领域最具权威的飞行员,通过比赛对于选手的飞行速度、技术能力和飞行过程中的姿态控制有一个全面直观的判断,优胜者才有资格参加世锦赛。”</h3><h3>作为业内人,因掌握的具体信息有限,李良东无法对女飞行员遇难细节多加评价,他就自己更加了解的低空翼装飞行进行了分析。此间,他回忆了2011年底一次事故,事故地位于广州越秀区中山四路228-自编113号,当时就是由于微风吹偏了定位的气球导致飞行太过贴近悬崖,飞行员的腿打在了岩石上,但这位经验老到的选手还是在千钧一发之际下意识完成了开伞,保住了性命。</h3><h4 style="float:right">广州晚报实习生:李四报道</h4></div></body></html>'
除了正文还包含HTML代码格式,故需要进一步处理(使用第三方库html2text)
from html2text import html2text
html2text(txt)
处理后结果如下:
'\ufeff\n\n# 深度|翼装飞行是玩命?拒绝冒险,专业比赛都要“看天吃饭”\n\n###\n翼装飞行其实最早是从高空跳伞运动中产生的,一些爱好者希望实现人类自由飞翔而开始穿着翼装,然后才逐渐出现低空翼装飞行这样更加刺激的飞行形式。”根据方泽体育的介绍,翼装飞行之所以危险性高,主要源于两个原因:一是飞行速度快;二是起跳方式和飞行环境的特殊。\n\n## 极限运动,反而最不能冒风险\n\n###\n值得一提的是,对于高空翼装跳伞,全球有相关的培训中心和机构认证,经过培训合格的人才可以拿到证书。而低空翼装飞行没有被大范围推广,并不存在相关的资格认证,那么作为赛事方,如何来评定参赛者的准入资格呢?相关人员告诉记者,低空翼装飞行这样的超极限运动非常小众,全球人数也不过600人左右,国内更是只有寥寥数人,有鉴于此,世界翼装飞行联盟会举办一个预选赛来决定参赛人选。“预选赛每年6月份在挪威举行,是从海边悬崖上定点起跳,但整体难度略低,相对安全。裁判都是翼装飞行领域最具权威的飞行员,通过比赛对于选手的飞行速度、技术能力和飞行过程中的姿态控制有一个全面直观的判断,优胜者才有资格参加世锦赛。”\n\n###\n作为业内人,因掌握的具体信息有限,李良东无法对女飞行员遇难细节多加评价,他就自己更加了解的低空翼装飞行进行了分析。此间,他回忆了2011年底一次事故,事故地位于广州越秀区中山四路228-自编113号,当时就是由于微风吹偏了定位的气球导致飞行太过贴近悬崖,飞行员的腿打在了岩石上,但这位经验老到的选手还是在千钧一发之际下意识完成了开伞,保住了性命。\n\n#### 广州晚报实习生:李四报道\n\n'
接下来就可以按照文本进行分析了。
例如 具有如下结构的html文件
感兴趣内容1
感兴趣内容2
……
感兴趣内容n
内容1
内容2
……
内容n
我们尝试获得'感兴趣内容'
对于文本内容,我们保存到IDList中。
可是如何标记我们遇到的文本是感兴趣的内容呢,也就是,处于
这里的内容
还有这里
……
以及这里的内容
思路如下
遇到
遇到
当flag 为True时遇到
设置标记getdata = True
遇到
且getdata = True,设置getdata = Falsepython为我们提供了SGMLParser类,SGMLParser 将 HTML 分析成 8 类数据[1],然后对每一类调用单独的方法:使用时只需继承SGMLParser 类,并编写页面信息的处理函数。
可用的处理函数如下:
开始标记 (Start tag)
是一个开始一个块的 HTML 标记,象 ,
, 或等,或是一个独一的标记,象
或 等。当它找到一个开始标记 tagname,SGMLParser 将查找名为 start_tagname 或 do_tagname 的方法。例如,当它找到一个
标记,它将查找一个 start_pre 或 do_pre 的方法。如果找到了,SGMLParser 会使用这个标记的属性列表来调用这个方法;否则,它用这个标记的名字和属性列表来调用 unknown_starttag 方法。
结束标记 (End tag)
是结束一个块的 HTML 标记,象 ,, 或
等。当找到一个结束标记时,SGMLParser 将查找名为end_tagname 的方法。如果找到,SGMLParser 调用这个方法,否则它使用标记的名字来调用 unknown_endtag 。字符引用 (Character reference)
用字符的十进制或等同的十六进制来表示的转义字符,象 。当找到,SGMLParser 使用十进制或等同的十六进制字符文本来调用handle_charref 。
实体引用 (Entity reference)
HTML 实体,象 ©。当找到,SGMLParser 使用 HTML 实体的名字来调用 handle_entityref。
注释 (Comment)
HTML 注释, 包括在 之间。当找到,SGMLParser 用注释内容来调用 handle_comment。
处理指令 (Processing instruction)
HTML 处理指令,包括在 ... > 之间。当找到,SGMLParser 用处理指令内容来调用 handle_pi。
声明 (Declaration)
HTML 声明,如 DOCTYPE,包括在 之间。当找到,SGMLParser 用声明内容来调用 handle_decl。
文本数据 (Text data)
文本块。不满足其它 7 种类别的任何东西。当找到,SGMLParser 用文本来调用 handle_data。
综上,的到如下代码
from sgmllib import SGMLParser
class GetIdList(SGMLParser):
def reset(self):
self.IDlist = []
self.flag = False
self.getdata = False
SGMLParser.reset(self)
def start_div(self, attrs):
for k,v in attrs:#遍历div的所有属性以及其值
if k == 'class' and v == 'entry-content':#确定进入了
self.flag = True
return
def end_div(self):#遇到
self.flag = False
def start_p(self, attrs):
if self.flag == False:
return
self.getdata = True
def end_p(self):#遇到
if self.getdata:
self.getdata = False
def handle_data(self, text):#处理文本
if self.getdata:
self.IDlist.append(text)
def printID(self):
for i in self.IDlist:
print i
上面的思路存在一个bug
遇到