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哥,转载时请注明出处及相应链接。

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

  • 相关阅读:
    批量新增百万条数据 十百万条数据
    sqlserver 组内排序
    EF ++属性会更新实体
    Entity Framework Core: A second operation started on this context before a previous operation completed
    abp Cannot access a disposed object. A common cause of this error is disposing
    abp xunit Can not register IHostingEnvironment. It should be a non-abstract class. If not, it should be registered before.”
    hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)
    EF 更新实体 The instance of entity type 'BabyEvent' cannot be tracked because another instance
    datatable to entiy list 不支持可空类型和枚举类型
    webapi 设置不显示接口到swaggerUI
  • 原文地址:https://www.cnblogs.com/liunnis/p/4703453.html
Copyright © 2011-2022 走看看