python 自带了一个类,叫 HTMLParser。
我们用的时候需要自己定义一个类,继承自 HTMLParser 。然后重写一部分方法。
下面是我们常用的解析html的方法,可以看到在 HTMLParser 里面,这些方法内容都是空的,也就是如果我们要用某个方法,我们得自己再我们的类里面重写这个方法。具体的每个方法的使用方式参见下文。
#Overridable -- finish processing of start+end tag:
defhandle_startendtag(self, tag, attrs):
self.handle_starttag(tag, attrs)
self.handle_endtag(tag)#Overridable -- handle start tag
defhandle_starttag(self, tag, attrs):pass
#Overridable -- handle end tag
defhandle_endtag(self, tag):pass
#Overridable -- handle character reference
defhandle_charref(self, name):pass
#Overridable -- handle entity reference
defhandle_entityref(self, name):pass
#Overridable -- handle data
defhandle_data(self, data):pass
#Overridable -- handle comment
defhandle_comment(self, data):pass
#Overridable -- handle declaration
defhandle_decl(self, decl):pass
#Overridable -- handle processing instruction
defhandle_pi(self, data):pass
使用
1. 简单解析
from html.parser importHTMLParserclassMyHTMLParser(HTMLParser):defhandle_starttag(self, tag, attrs):print("Encountered a start tag:", tag)defhandle_endtag(self, tag):print("Encountered an end tag :", tag)defhandle_data(self, data):print("Encountered some data :", data)
parser=MyHTMLParser()
parser.feed('
TestParse me!
')这里写了一个类 MyHTMLParse ,继承自 HTMLParser。然后重写了 handle_xxx方法。
然后只要调用该类的 feed() 方法,将html格式的数据传进去,遇到特定的数据,就会自动触发相应的方法。比如遇到就会触发handle_starttag()方法进行处理。
执行结果如下:
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h1
Encountered some data : Parse me!
Encountered an end tag : h1
Encountered an end tag : body
Encountered an end tag : html
2. 复杂解析
from html.parser importHTMLParserfrom html.entities importname2codepointclassMyHTMLParser(HTMLParser):defhandle_starttag(self, tag, attrs):print("Start tag:", tag)for attr inattrs:print("attr:", attr)defhandle_endtag(self, tag):print("End tag :", tag)defhandle_data(self, data):print("Data :", data)defhandle_comment(self, data):print("Comment :", data)defhandle_entityref(self, name):
c=chr(name2codepoint[name])print("Named ent:", c)defhandle_charref(self, name):if name.startswith('x'):
c= chr(int(name[1:], 16))else:
c=chr(int(name))print("Num ent :", c)defhandle_decl(self, data):print("Decl :", data)
parser= MyHTMLParser()
1)解析文档类型申明
传入html数据如下:
parser.feed('')
执行结果如下,可以看到会自动调用 handle_decl() 方法。
Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"
2) 解析属性
传入html数据如下:
parser.feed('')
执行结果如下,可以看到会自动调用 handle_starttag()方法。
Start tag: img
attr: ('src', 'python-logo.png')
attr: ('alt', 'The Python logo')
3)解析数据以及结束标签
传入html数据如下:
parser.feed('')
执行结果如下,可以看到会自动调用 handle_data() 以及 handle_endtag()方法。
Start tag: style
attr: ('type', 'text/css')
Data :#python { color: green }
End tag : style
4)解析备注
传入html数据如下:
parser.feed('')
执行结果如下,可以看到会自动调用 handle_comment()方法。
Comment : a comment
Comment : [if IE 9]>IE-specific content
5)解析实体字符
传入html数据如下:
parser.feed('>>>')
在html语言中 ‘>’这个符号,实体名称为 > , 实体编号为 >。这里 >表示16进制数字,3E转化过来和62 是一致的。
执行结果如下,可以看到会自动调用 handle_entityref() 来处理 > ,然后调用 handle_charref()来处理 > 以及 >。
Named ent: >Num ent :>Num ent :>