網頁

2010年2月16日 星期二

使用 python + curl 取得網頁內容(2)

當我們取得整個網頁的 html 文件後,接下來就是從 html 中取得我們有興趣的訊息,例如可以搜尋 a 標籤來取得網頁中的連結,以下範例從 http://chobill.twbbs.org/blog/ 網頁中取得所有連結,以 GetPageByFakeBrowser 取得網頁內容,接著使用 URLParser 將網頁連結過濾出來:

#! /usr/bin/env python
import pycurl

class GetPage:
    def __init__ (self, url):
        self.contents =''
        self.url = url

    def read_page (self, buf):
        self.contents = self.contents + buf

    def show_page (self):
        print self.contents

class GetPageByFakeBrowser(GetPage):
    def __init__ (self, url, ua):
        self.contents = ''
        self.url = url
        self.ua = ua

import HTMLParser
class URLParser(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.urls = []

    def handle_starttag(self, tag, attributes):
        if tag != 'a': return
        for name, value in attributes:
            if name == 'href' and value not in self.urls:
                self.urls.append (value)

mypage = GetPageByFakeBrowser( \
"http://chobill.twbbs.org/blog/", \
"Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/10.00")
testcurl = pycurl.Curl()
testcurl.setopt(testcurl.URL, mypage.url)
testcurl.setopt(testcurl.USERAGENT, mypage.ua)
testcurl.setopt(testcurl.WRITEFUNCTION, mypage.read_page)
testcurl.perform()
testcurl.close()
parser = URLParser()
parser.feed ( mypage.contents )
parser.close()
for url in parser.urls:
    print url 
然而這個程式在許多情況下並不管用,因為這世界上存在許多撰寫的相當"有藝術"或是加入一些直譯語言的網頁,它們會讓這支程式在處理 html 文件時出錯,我們之後會回過頭來修正這些問題。

沒有留言:

張貼留言