posts - 431,  comments - 344,  trackbacks - 0
          sgmllib.py 包含一個(gè)重要的類: SGMLParserSGMLParserHTML 分解成有用的片段,比如開(kāi)始標(biāo)記和結(jié)束標(biāo)記。一旦它成功地分解出某個(gè)數(shù)據(jù)為一個(gè)有用的片段,它會(huì)根據(jù)所發(fā)現(xiàn)的數(shù)據(jù),調(diào)用一個(gè)自身內(nèi)部的方法。為了使用這個(gè)分析器,您需要子類化 SGMLParser 類,并且覆蓋這些方法。
          SGMLParserHTML 分析成 8 類數(shù)據(jù),然后對(duì)每一類調(diào)用單獨(dú)的方法:
          開(kāi)始標(biāo)記 (Start tag)
          是一個(gè)開(kāi)始一個(gè)塊的 HTML 標(biāo)記,象 <html><head><body><pre> 等,或是一個(gè)獨(dú)一的標(biāo)記,象 <br><img> 等。當(dāng)它找到一個(gè)開(kāi)始標(biāo)記 tagnameSGMLParser 將查找名為 start_tagnamedo_tagname 的方法。例如,當(dāng)它找到一個(gè) <pre> 標(biāo)記,它將查找一個(gè) start_predo_pre 的方法。如果找到了,SGMLParser 會(huì)使用這個(gè)標(biāo)記的屬性列表來(lái)調(diào)用這個(gè)方法;否則,它用這個(gè)標(biāo)記的名字和屬性列表來(lái)調(diào)用 unknown_starttag 方法。
          結(jié)束標(biāo)記 (End tag)
          是結(jié)束一個(gè)塊的 HTML 標(biāo)記,象 </html></head></body></pre> 等。當(dāng)找到一個(gè)結(jié)束標(biāo)記時(shí),SGMLParser 將查找名為 end_tagname 的方法。如果找到,SGMLParser 調(diào)用這個(gè)方法,否則它使用標(biāo)記的名字來(lái)調(diào)用 unknown_endtag
          字符引用 (Character reference)
          用字符的十進(jìn)制或等同的十六進(jìn)制來(lái)表示的轉(zhuǎn)義字符,象  。當(dāng)找到,SGMLParser 使用十進(jìn)制或等同的十六進(jìn)制字符文本來(lái)調(diào)用 handle_charref
          實(shí)體引用 (Entity reference)
          HTML 實(shí)體,象 &copy;。當(dāng)找到,SGMLParser 使用 HTML 實(shí)體的名字來(lái)調(diào)用 handle_entityref
          注釋 (Comment)
          HTML 注釋, 包括在 <!-- ... -->之間。當(dāng)找到,SGMLParser 用注釋內(nèi)容來(lái)調(diào)用 handle_comment
          處理指令 (Processing instruction)
          HTML 處理指令,包括在 <? ... > 之間。當(dāng)找到,SGMLParser 用處理指令內(nèi)容來(lái)調(diào)用 handle_pi
          聲明 (Declaration)
          HTML 聲明,如 DOCTYPE,包括在 <! ... >之間。當(dāng)找到,SGMLParser 用聲明內(nèi)容來(lái)調(diào)用 handle_decl
          文本數(shù)據(jù) (Text data)
          文本塊。不滿足其它 7 種類別的任何東西。當(dāng)找到,SGMLParser 用文本來(lái)調(diào)用 handle_data

          urllib 模塊是標(biāo)準(zhǔn) Python 庫(kù)的一部分。它包含了一些函數(shù),可以從基于互聯(lián)網(wǎng)的 URL (主要指網(wǎng)頁(yè)) 來(lái)獲取信息并且真正取回?cái)?shù)據(jù)。urllib 模塊最簡(jiǎn)單的使用是提取用 urlopen 函數(shù)取回的網(wǎng)頁(yè)的整個(gè)文本。打開(kāi)一個(gè) URL打開(kāi)一個(gè)文件相似。urlopen 的返回值是象文件一樣的對(duì)象,它具有一個(gè)文件對(duì)象一樣的方法。使用由 urlopen 所返回的類文件對(duì)象所能做的最簡(jiǎn)單的事情就是 read,它可以將網(wǎng)頁(yè)的整個(gè) HTML 讀到一個(gè)字符串中。這個(gè)對(duì)象也支持 readlines 方法,這個(gè)方法可以將文本按行放入一個(gè)列表中。當(dāng)用完這個(gè)對(duì)象,要確保將它 close,就如同一個(gè)普通的文件對(duì)象。

           urllister.py

          from sgmllib import SGMLParser

          class URLLister(SGMLParser):
              def reset(self):
                  SGMLParser.reset(self)
                  self.urls=[]
                  self.imgs=[]
              def start_a(self, attrs):
                  href = [v for k, v in attrs if k=='href']
                  if href:
                      self.urls.extend(href)
              def start_img(self, attrs):
                  img = [v for k, v in attrs if k=='src']
                  if img:
                      self.imgs.extend(img)

          1.resetSGMLParser__init__ 方法來(lái)調(diào)用,也可以在創(chuàng)建一個(gè)分析器實(shí)例時(shí)手工來(lái)調(diào)用。所以如果您需要做初始化,在 reset 中去做,而不要在 __init__ 中做。這樣當(dāng)某人重用一個(gè)分析器實(shí)例時(shí),會(huì)正確地重新初始化。
          2.象 k=='href' 的字符串比較是區(qū)分大小寫(xiě)的,但是這里是安全的。因?yàn)?SGMLParser 會(huì)在創(chuàng)建 attrs 時(shí)將屬性名轉(zhuǎn)化為小寫(xiě)。
          test.py
          import urllib, urllister
          usock=urllib.urlopen("http://www.aygfsteel.com/rain1102")
          parser=urllister.URLLister()
          parser.feed(usock.read())
          usock.close()
          parser.close()
          for url in parser.urls:print url
          for img in parser.imgs:print img
          posted on 2007-10-17 10:51 周銳 閱讀(2201) 評(píng)論(0)  編輯  收藏 所屬分類: Python
          主站蜘蛛池模板: 涿鹿县| 绥中县| 扶风县| 龙岩市| 丰县| 仁寿县| 济南市| 福贡县| 全南县| 普定县| 福海县| 锡林浩特市| 浙江省| 监利县| 武鸣县| 都江堰市| 息烽县| 孝昌县| 平和县| 沁源县| 博乐市| 尼木县| 新泰市| 黑河市| 铁力市| 清河县| 垫江县| 嘉定区| 稻城县| 铜鼓县| 岫岩| 冷水江市| 枞阳县| 邛崃市| 邢台市| 六安市| 紫金县| 永登县| 财经| 丰镇市| 灯塔市|