您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > python提取html当中的信息
SGMLParserPython默认自带HTMLParser以及SGMLParser等等解析器,前者实在是太难用了,我就用SGMLParser写了一个示例程序:importurllib2fromsgmllibimportSGMLParserclassListName(SGMLParser):def__init__(self):SGMLParser.__init__(self)self.is_h4=self.name=[]defstart_h4(self,attrs):self.is_h4=1defend_h4(self):self.is_h4=defhandle_data(self,text):ifself.is_h4==1:self.name.append(text)content=urllib2.urlopen(').read()listname=ListName()listname.feed(content)foriteminlistname.name:printitem.decode('gbk').encode('utf8')很简单,这里定义了一个叫做ListName的类,继承SGMLParser里面的方法。使用一个变量is_h4做标记判定html文件中的h4标签,如果遇到h4标签,则将标签内的内容加入到List变量name中。解释一下start_h4()和end_h4()函数,他们原型是SGMLParser中的start_tagname(self,attrs)end_tagname(self)tagname就是标签名称,比如当遇到pre,就会调用start_pre,遇到/pre,就会调用end_pre。attrs为标签的参数,以[(attribute,value),(attribute,value),...]的形式传回。输出:虚拟票务数码市场家电市场女装市场男装市场童装童鞋女鞋市场男鞋市场内衣市场箱包市场服饰配件珠宝饰品美容市场母婴市场家居市场日用市场食品/保健运动鞋服运动户外汽车用品玩具市场文化用品市场爱好市场生活服务如果有乱码,可能是与网页编码不一致,需要替换最后一句deconde()的参数,我在香港淘宝默认用的是繁体编码。各位可以copy上面的代码自己试试,把淘宝的商品目录抓下来,就是这么简单。稍微改改,就可以抽取二级分类等其他信息python的SGMLParser模块处理html解析非常的方便,它是处理网页解析的好帮手,能够将HTML处理分成三步:将HTML分解成它的组成片段,对片段进行加工,接着将片段再重新合成HTML。第一步是通过sgmllib.py来完成的,它是标准Python库的一部分。理解本章的关键是要知道HTML不只是文本,更是结构化文本。这种结构来源于开始与结束标记的或多或少分级序列。通常您并不以这种方式处理HTML,而是以文本方式在一个文本编辑中对其进行处理,或以可视的方式在一个浏览器中进行浏览或页面编辑工具中进行编辑。sgmllib.py表现出了HTML的结构。sgmllib.py包含一个重要的类:SGMLParser。SGMLParser将HTML分解成有用的片段,比如开始标记和结束标记。在它成功地分解出某个数据为一个有用的片段后,它会根据所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化SGMLParser类,并且覆盖这些方法。这就是当我说它表示了HTML结构的意思:HTML的结构决定了方法调用的次序和传给每个方法的参数。SGMLParser将HTML分析成8类数据,然后对每一类调用单独的方法:开始标记(Starttag)是开始一个块的HTML标记,像、、或等,或是一个独一的标记,像或等。当它找到一个开始标记tagname,SGMLParser将查找名为start_tagname或do_tagname的方法。例如,当它找到一个标记,它将查找一个start_pre或do_pre的方法。如果找到了,SGMLParser会使用这个标记的属性列表来调用这个方法;否则,它用这个标记的名字和属性列表来调用unknown_starttag方法。结束标记(Endtag)是结束一个块的HTML标记,像、、或等。当找到一个结束标记时,SGMLParser将查找名为end_tagname的方法。如果找到,SGMLParser调用这个方法,否则它使用标记的名字来调用unknown_endtag。字符引用(Characterreference)用字符的十进制或等同的十六进制来表示的转义字符,像。当找到,SGMLParser使用十进制或等同的十六进制字符文本来调用handle_charref。实体引用(Entityreference)HTML实体,像©。当找到,SGMLParser使用HTML实体的名字来调用handle_entityref。注释(Comment)HTML注释,包括在之间。当找到,SGMLParser用注释内容来调用handle_comment。处理指令(Processinginstruction)HTML处理指令,包括在之间。当找到,SGMLParser用处理指令内容来调用handle_pi。声明(Declaration)HTML声明,如DOCTYPE,包括在之间。当找到,SGMLParser用声明内容来调用handle_decl。文本数据(Textdata)文本块。不满足其它7种类别的任何东西。当找到,SGMLParser用文本来调用handle_data。重要Python2.0存在一个bug,即SGMLParser完全不能识别声明(handle_decl永远不会调用),这就意味着DOCTYPE被静静地忽略掉了。这个错误在Python2.1中改正了。sgmllib.py所附带的一个测试套件举例说明了这一点。您可以运行sgmllib.py,在命令行下传入一个HTML文件的名字,然后它会在分析标记和其它元素的同时将它们打印出来。它的实现是通过子类化SGMLParser类,然后定义unknown_starttag,unknown_endtag,handle_data和其它方法来实现的。这些方法简单地打印出它们的参数。如果要详细的了解pythonSGMLParser的用法的话,可以看看pythonSGMLParser的文档,下面放上个我用pythonSGMLParsr写的例子,希望对大家有帮助:#encoding=utf-8#@description:baidutibacontentimportsysimportreimporthttplibimporturllibfromsgmllibimportSGMLParserclassBaidutiebaParser(SGMLParser):'''在百度贴吧里采集相应的关键字的标题'''defreset(self):SGMLParser.reset(self)self.info=[]#self.q_check=0self.num=0self.strcontent=''defstart_td(self,tag):'''匹配标签'''iflen(tag)!=0andtag[0][1]=='s':self.num=self.num+1self.q_check=1defhandle_data(self,text):'''处理文本'''txt=text.strip()iftxtandself.q_check:foriinchecklist:pipei=r'%s'%str(i)#在要匹配的信息里找到和关键字匹配check_pan=re.compile(pipei)ifcheck_pan.search(txt)isnotNone:self.info.append(txt)else:continueself.strcontent='$|$'.join(self.info)defend_td(self):'''匹配'''self.q_check=0############################################配置信息#############################keylist=['旅游']#贴吧名称checklist=['张家界','韩国']#要查询的关键字content={}#采集内容forminkeylist:page=0keyword=urllib.quote(m.decode('utf-8').encode('gbk'))foriinxrange(10):url='''=0&ct=318767104&lm=11&sc=0&rn=50&tn=baiduKeywordSearch&rs3=0&rs4=0&word=%s&pn=%s'''%(str(keyword),str(page))data=urllib.urlopen(url).read()data=unicode(data,'gbk').encode('utf-8')parser=BaidutiebaParser()parser.feed(data)content[i+1]=parser.strcontentpage=page+50forkincontent.keys():printkprintcontent[k]
本文标题:python提取html当中的信息
链接地址:https://www.777doc.com/doc-4210737 .html