爬蟲第一章筆記

本文代碼爲學習後自己加了很多註釋
主要供自己以後查閱
感謝原作者的教學貼
# -*- 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()

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