python3 解析html_Python 3 解析 html

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('

Test

Parse 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('The Python logo')

执行结果如下,可以看到会自动调用 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语言中 ‘>’这个符号,实体名称为 &gt , 实体编号为 >。这里 >表示16进制数字,3E转化过来和62 是一致的。

执行结果如下,可以看到会自动调用 handle_entityref() 来处理 &gt ,然后调用 handle_charref()来处理 > 以及 >。

Named ent: >Num ent :>Num ent :>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值