爬虫第一章笔记

本文代码为学习后自己加了很多注释
主要供自己以后查阅
感谢原作者的教学贴
# -*- coding: utf-8 -*-
import urllib
import sgmllib
"""
beautifulsoup的相关包导入
"""
from bs4 import BeautifulSoup
import re

"""
导入url解析包
"""
import urlparse
"""
自定义一个类继承sgmllib的SGMParser类
复写SGMLParser的方法,
    注意:unknown_html()方法名不能修改,好像是SGM内的方法
通过自定义类对象的feed(data)方法将解析数据传入
"""

class handle_html_01(sgmllib.SGMLParser):
    def unknown_starttag(self,tag,attrs):
        print "------"+tag+" start------"
        print attrs
    def unknown_endtag(self,tag):
        print "------"+tag+" end------"
"""
对对象进行删选
"""
class handle_html_02(sgmllib.SGMLParser):
    def unknown_starttag(self,tag,attrs):
        try:
            for attr in attrs:
                if attr[0]=='href':
                    print attr[1].encode('utf-8')
        except:
            pass
    def unknown_endtag(self,tag):
        pass


"""
beautifulsoup并不只是简单的解析html文档,实际上里面大有玄机:
五种解析器自动选择或者手动指定,每个解析器的偏重方向都不一样,有的偏重速度,有的偏重正确率。
自动识别html文档的编码,并且给出非常完美的解决方案,支持css筛选,各种参数的方便使用。
相关包
from bs4 import BeautifulSoup
import urllib
import re

关于正则表达式:
^:匹配开头
?:好像是匹配任意字符(还没有验证),应该是https
"""
def test_bs():
    web=urllib.urlopen("http://www.baidu.com")
    soup=BeautifulSoup(web.read())
    tags_a=soup.findAll(name="a",attrs={'href':re.compile("^http?://")})
    for tag_a in tags_a:
        print tag_a["href"]

"""
测试所用方法
"""        
def test_01():
    web=urllib.urlopen("http://www.baidu.com")
    #创建handle_html对象
    web_handler=handle_html_02()
    #传输数据到解析器
    web_handler.feed(web.read())
"""
测试url的合法性
首先导入urlParse包
查看结果scheme 为http就是链接
根据结果分析
o[0]就是scheme
o[1]就是netloc
一次类推
其实分析就是 冒号前是scheme
双斜杠是 netloc
单斜杠后是 path
然后问号后是参数井号后不清楚 
总之有分析过程
"""
def test_urlparse():
    url = set()
    url.add('javascript:void.com')
    url.add('http://freebuf.com/geek')
    url.add('https://freebuf.com:443/geek?username=1#sid')
    url.add('ftp://freeme.com/ss/s/s')
    url.add('sssfadea://ssss.ss')
    url.add('//freebuf.com/s/s/s')
    url.add('/freebuf.com/s/s/s/')
    url.add('//freebuf.com/s/s/s/')
    url.add('path/me')
    url.add('path?ss=1')
    url.add('path?ss=1&s=1')
    url.add('path?ss=1#arch')
    url.add('?ss=1')
    url.add('#arch')
    for item in url:
        print item
        o= urlparse.urlparse(item)
        print o    
#test_01()
#test_bs()
test_urlparse()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章