python SGMLParser學習的一點心得

2021-09-06 00:02:31 字數 3727 閱讀 2904

pythonsgmlparser模組處理html解析非常的方便,它將html 處理分成三步:將 html 分解成它的組成片段,對片段進行加工,接著將片段再重新合成 html。第一步是通過 sgmllib.py 來完成的,它是標準 python 庫的一部分。

理解本章的關鍵是要知道 html 不只是文字,更是結構化文字。這種結構**於開始與結束標記的或多或少分級序列。通常您並不以這種方式處理 html,而是以文字方式 在乙個文字編輯中對其進行處理,或以可視的方式 在乙個瀏覽器中進行瀏覽或頁面編輯工具中進行編輯。sgmllib.py 表現出了html 的結構。

sgmllib.py 包含乙個重要的類:sgmlparser。sgmlparser 將 html分解成有用的片段,比如開始標記和結束標記。在它成功地分解出某個資料為乙個有用的片段後,它會根據所發現的資料,呼叫乙個自身內部的方法。為了使用這個分析器,您需要子類化 sgmlparser 類,並且覆蓋這些方法。這就是當我說它表示了 html 結構 的意思:html的結構決定了方法呼叫的次序和傳給每個方法的引數。

sgmlparser 將 html 分析成 8 類資料,然後對每一類呼叫單獨的方法:

開始標記 (start tag)

是開始乙個塊的 html 標記,像 、、 或

等,或是乙個獨一的標記,

像 或

等。當它找到乙個開始標記 tagname,

sgmlparser 將查詢名為 start_tagname 或 do_tagname 的方法。

例如,當它找到乙個

標記,它將查詢乙個 start_pre 或 do_pre 的方法。

如果找到了,sgmlparser 會使用這個標記的屬性列表來呼叫這個方法;

否則,它用這個標記的名字和屬性列表來呼叫 unknown_starttag 方法。

結束標記 (end tag)

是結束乙個塊的 html 標記,像 、、 或

等。

當找到乙個結束標記時,sgmlparser 將查詢名為 end_tagname 的方法。

如果找到,sgmlparser 呼叫這個方法,否則它使用標記的名字來呼叫 unknown_endtag 。

字元引用 (character reference)

用字元的十進位制或等同的十六進製制來表示的轉義字元,

像  。當找到,sgmlparser 使用十進位制或等同的十六進製制字元文本來呼叫 handle_charref 。

實體引用 (entity reference)

注釋 (comment)

html 注釋,包括在 之間。當找到,sgmlparser 用注釋內容來呼叫 handle_comment。

處理指令 (processing instruction)

html 處理指令,包括在 之間。當找到,sgmlparser 用處理指令內容來呼叫 handle_pi。

宣告 (declaration)

html 宣告,如 doctype,包括在 之間。當找到,sgmlparser 用宣告內容來呼叫 handle_decl。

文字資料 (text data)

文字塊。不滿足其它 7 種類別的任何東西。當找到,sgmlparser 用文本來呼叫 handle_data。

重要python 2.0 存在乙個 bug,即 sgmlparser 完全不能識別宣告 (handle_decl 永遠不會呼叫),

這就意味著 doctype 被靜靜地忽略掉了。這個錯誤在 python 2.1 中改正了。

sgmllib.py 所附帶的乙個測試套件舉例說明了這一點。您可以執行 sgmllib.py,

在命令列下傳入乙個 html 檔案的名字,然後它會在分析標記和其它元素的同時將它們列印出來。

它的實現是通過子類化 sgmlparser 類,然後定義 unknown_starttag,unknown_endtag,handle_data

和其它方法來實現的。這些方法簡單地列印出它們的引數。

如果要詳細的了解python sgmlparser的用法的話,可以看看python sgmlparser

的文件,

'''匹配 標籤'''

if len(tag)!=0 and tag[0][1] == 's':

self.num = self.num + 1

self.q_check = 1

def handle_data(self, text):

'''處理文字'''

txt = text.strip()

if txt and self.q_check:

for i in checklist:

pipei = r'%s' % str(i)#在要匹配的資訊裡找到和關鍵字匹配

check_pan = re.compile(pipei)

if check_pan.search(txt) is not none:

else:

continue

self.strcontent = '$|$'.join(self.info)

def end_td(self):

'''匹配'''

self.q_check = 0

############################################配置資訊#############################

keylist = ['旅遊']#貼吧名稱

checklist = ['張家界','南韓']#要查詢的關鍵字

content = {}#採集內容

如果你對python queue模組

也感興趣的話,可以看看!

上面的例子也用到了python 字串替換

的一些方法。

python教程

,希望大家能夠喜歡

使用Authentication的一點心得

我寫了乙個例子程式 第一次使用基於froms的驗證 首先假設使用者登陸成功 這個一般從資料庫得到驗證 然後寫入驗證票據authentication.以後的頁面中判斷這個使用者是否通過驗證,如果沒有,重定向到使用者登陸頁面 如果已經登陸,則執行業務邏輯 本文重點在討論authentication在角色...

python def和lambda的一點心得

原文 python def和python lambda這2個有相似點也有不同點,今天給大家分享下自己的心得吧。先說說2個的相似點 這兩個很重要的相似點就是都可以定義一些固定的方法或者是流程,供給程式來呼叫,比如我們要定義乙個變數加2的方法。首先看python def吧。definfo x retur...

python def和lambda的一點心得

原文 python def和python lambda這2個有相似點也有不同點,今天給大家分享下自己的心得吧。先說說2個的相似點 這兩個很重要的相似點就是都可以定義一些固定的方法或者是流程,供給程式來呼叫,比如我們要定義乙個變數加2的方法。首先看python def吧。definfo x retur...