zoukankan      html  css  js  c++  java
  • python 爬虫部分解释

    example:self.file = www.baidu.com存有baidu站的index.html

    1     def parseAndGetLinks(self):  # parse HTML, save links
    2         self.parser = HTMLParser(AbstractFormatter(DumbWriter(StringIO())))
    3         self.parser.feed(open(self.file).read())
    4         self.parser.close()
    5         return self.parser.anchorlist

     *******************@先搜一下伙伴们的成果*****************************

    HTMLParser(AbstractFormatter(DumbWriter(StringIO)))  ”’ 使用HTMLParser的方法进行处理,StringIO是从内存中读取数据,DumbWriter将事件流转换为存文本文档”’
    主要是AbstractFormatter 查了下相关资料

    formatter 模块
    formatter 模块提供了一些可用于 htmllib 的格式类( formatter classes ).
    这些类有两种, formatter 和 writer . formatter 将 HTML 解析器的标签和数据流转换为适合输出设备的事件流( event stream ), 而 writer 将事件流输出到设备上.
    大多情况下, 你可以使用 AbstractFormatter 类进行格式化. 它会根据不同的格式化事件调用 writer 对象的方法. AbstractWriter 类在每次方法调用时打印一条信息.

    HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。 HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它 主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然 后重新定义这几个以handler_开头的函数即可。这几个函数包括:
    handle_startendtag  处理开始标签和结束标签
    handle_starttag     处理开始标签,比如<xx>
    handle_endtag       处理结束标签,比如</xx>
    handle_charref      处理特殊字符串,就是以&#开头的,一般是内码表示的字符
    handle_entityref    处理一些特殊字符,以&开头的,比如 &nbsp;
    handle_data         处理数据,就是<xx>data</xx>中间的那些数据
    handle_comment      处理注释
    handle_decl         处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
    handle_pi           处理形如<?instruction>的东西
        这里我以从网页中获取到url为例,介绍一下。要想获取到url,肯定是要分析<a>标签,然后取到它的href属性的值。下面是代码:

    #-*- encoding: gb2312 -*-
    import HTMLParser

    class MyParser(HTMLParser.HTMLParser):
        def __init__(self):
            HTMLParser.HTMLParser.__init__(self)        
            
        def handle_starttag(self, tag, attrs):
            # 这里重新定义了处理开始标签的函数
            if tag == ‘a’:
                # 判断标签<a>的属性
                for name,value in attrs:
                    if name == ‘href’:
                        print value
            

    if __name__ == ‘__main__’:
        a = ‘<html><head><title>test</title>< body><a href=”http://www.163.com”>链接到163</a></body& gt;</html>’
        
        my = MyParser()
        # 传入要分析的数据,是html的。
        my.feed(a)

    class HTMLParser.HTMLParser:使用HTMLParser 的实例,填充HTML数据,并在开始和结束标记间调用函数.HTMLParser类意味着重载.和 htmllib 的分析器不同,this parser并不检测和开始标记对应的结束标记

    HTMLParser 实例有如下的方法:
    HTMLParser.reset()  #重置实例.所有未处理的数据都会丢失.在初始化时自动调用.
    HTMLParser.feed(data) #给分析器喂食.在由完整元素构成的情况下工作;不完整数据情况下,会进行缓冲知道更多数据加进来或者 close() 被调用.
    HTMLParser.close()  #处理所有缓冲数据.这个方法可以被派生类重定义,以便在输入结束后处理额外的事情,重定义的版本也要调用 HTMLParser 基类的 close() 方法.
    HTMLParser.getpos() #返回当前行数和列数
    HTMLParser.get_starttag_text() #返回最近打开过得开始标记处的文本.通常不会用到
    HTMLParser.handle_starttag(tag, attrs) #该方法用来处理一个标记的开始.tag参数是tag的名字的小写化.attrs参数是一个list,由(name,value)组成,反映 了<>里面的属性. name会被翻译成小写字母,在value中的引号也被移除了,字符实体引用也会被替换.例如,有个 tag<A HREF=”http://www.cwi.nl/”> ,那么使用该方法就该这么做: handle_starttag(‘a’, [('href','http://www.cwi.nl/')])
    HTMLParser.handle_startendtag(tag, attrs) #和handle_starttag()类似,用来处理XHTML风格的空标签(<a …/>).可能被子类重载
    HTMLParser.handle_endtag(tag) #该方法用来处理元素结束标记.可以被派生类重载;基类什么也不做. tag参数是tag的name转化来的小写字母.
    HTMLParser.handle_data(data) #该方法用来处理随机的数据.
    HTMLParser.handle_charref(name) #处理 &#ref 格式的字符引用.
    HTMLParser.handle_entityref(name)  #处理一般的 &name 格式的实体引用. name 是一个一般的实体引用.
    HTMLParser.handle_comment(data) #处理遇到注释的情况.注释参数为在——和——之间的字符串文本,而不是分隔符自身.例如 <!–text–> ,该方法将调用’text’.
    HTMLParser.handle_decl(decl) #当分析器遇到SGML声明时调用此方法. decl 参数是 <!…> 标记里的整个内容.
    HTMLParser.handle_pi(data) #处理命令, data 参数包含整个的处理命令.例如 <?proc color=’red’> ,该方法应写成 handle_pi(“proc color=’red’”).

    使用实例:

    #!/usr/bin/python
    #-*- encoding: utf-8 -*-
    import HTMLParserclass MyParser(HTMLParser.HTMLParser):
        def __init__(self):
            HTMLParser.HTMLParser.__init__(self)               
        def handle_starttag(self, tag, attrs):
            # 这里重新定义了处理开始标签的函数
            if tag == ‘a’:
                # 判断标签<a>的属性
                for name,value in attrs:
                    if name == ‘href’:
                        print value
           
    if __name__ == ‘__main__’:
        a = ‘<html><head><title>test</title><body><a href=”http: //www.163.com”>链接到163</a><a href=”http://www.linuxqq.net“>焦点</a></body></html>’
        my = MyParser()
        # 传入要分析的数据,是html的。
        my.feed(a)

    运行结果:

    www.163.com www.linuxqq.net http: //www.163.com
    http://www.linuxqq.net
    handle_startendtag 处理开始标签和结束标签
    handle_starttag     处理开始标签,比如<xx>
    handle_endtag       处理结束标签,比如</xx>
    handle_charref      处理特殊字符串,就是以&#开头的,一般是内码表示的字符
    handle_entityref    处理一些特殊字符,以&开头的,比如 &nbsp;
    handle_data         处理数据,就是<xx>data</xx>中间的那些数据
    handle_comment      处理注释
    handle_decl         处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
    handle_pi           处理形如<?instruction>的东西

    本文出自 小Q哥,转载时请注明出处及相应链接。

    *************************************************************************************************

  • 相关阅读:
    Structure Boundary Preserving Segmentation for Medical Image With Ambiguous Boundary(理解)
    Deep Gamblers: Learning to Abstain with Portfolio Theory(理解)(github代码)
    DeepSurv: Personalized Treatment Recommender System Using A Cox Proportional Hazards Deep Neural Network(理解)(github代码)
    Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting(理解)(github代码)
    【分类算法】朴素贝叶斯(Naive Bayes)
    【分类算法】感知机(Perceptron)
    【集成模型】Boosting
    【集成模型】Stacking
    【集成模型】Bootstrap Aggregating(Bagging)
    数据科学导引(大纲)
  • 原文地址:https://www.cnblogs.com/liunnis/p/4703453.html
Copyright © 2011-2022 走看看