网络爬虫之HTMLParser

HTMLParserpython自带的网页解析工具,使用很简单。便于HTML文件的解析
下面我们来看相关代码:
class Newparser(HTMLParser):

    def __init__(self):

        HTMLParser.__init__(self)

        self.flag=False

        self.text=[]

    def handle_starttag(self,tag,attrs):

        if tag == 'span':

            self.flag=True

    def handle_data(self, data):

        if self.flag == True:

            print data

            self.text.append(data)

    def handle_endtag(self, tag):

        if tag == 'span':

            self.flag=False


if __name__=="__main__":

    parser=Newparser()

    try:

        req=urllib2.Request('http://www.xunsee.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/index.shtml')

        fd=urllib2.urlopen(req)

        parser.feed(fd.read())

        print parser.text



    except BaseException,e:

        print e
 
首先定义一个类继承自HTMLParser.__init__函数中定义一些自己的参数。
parser.feed(fd.read()) 其中feed函数是类自带的函数。参数就是网页的HTML代码。其中feed相当于一个驱动函数。我们来看下feed函数的原型。下面是feed的实现。可以看到实现了2个功能。其中就是将传入的网页代码赋值给rawdata。然后运行goahead开始进行处理
def feed(self, data):

    r"""Feed data to the parser.



    Call this as often as you want, with as little or as much text

    as you want (may include '\n').

    """

    self.rawdata = self.rawdata + data

    self.goahead(0)

goahead函数代码过多,这里就不全部贴出来,具体功能就是遍历rawdata每行数据。然后根据的不同标识调用不同的函数。关键函数如下。可以看到当遇到’<’开始的时候。调用parse_startag,当遇到’</’调用parse_endtag



parse_startag里面实现handle_starttagparse_endtag里面实现handle_endtag
代码中的handle_starttaghandle_endtag是个空函数。只是传入了当前的tag以及attrs.这就给了我们重写此函数的机会
def handle_starttag(self, tag, attrs):

    pass
def handle_endtag(self, tag):

    pass
def handle_data(self, data):

    pass
其中hanle_data是处理网页代码中的具体数据
 
说了这么多,应该对HTMLParser的实现很清楚了。对每行网页代码进行处理。依次判断是否进入handle_starttaghandle_endtaghandle_data

handle_endtag       处理结束标签,比如</xx>

handle_entityref    处理一些特殊字符,以&开头的,比如 &nbsp;

handle_data         处理数据,就是<xx>data</xx>中间的那些数据<span lang="EN-US" style="" font-size:6.5pt;"="">

handle_comment      处理注释

handle_decl         处理<!开头的,比如<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

handle_pi           处理形如<?instruction>的东西
其他的实现都大同小异。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿与代码

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值