2013-06-13 58 views
0

這是我們爲html解析編寫的程序。 它完美的作品。關於HTML解析的問題

我們在網上找到了一個演示程序,我們根據自己的需求對其進行了修改。 但我們不明白它是如何工作的。

import urllib 
from urllib.request import urlopen 


address='http://www.iitb.ac.in/acadpublic/RunningCourses.jsp?deptcd=EE&year=2012&semester=1' 
print(address) 
source= urlopen(address).read() 
source=str(source) 


from html.parser import HTMLParser 

str1 = input('Enter name of prof:') 

class MyHTMLParser(HTMLParser): 
    y=" " 
    def handle_data(self, data): 
     flag=0 
     x=str(data) 
     for i in range(len(x)): 
      if (x[i]=='\\'): 
       flag=1 
       break 
     if(flag==0) : 
      if(x==str1): 
       global y 
       print("Name of professor:",x) 
       print("Name of course:",y) 
      y=x 

parser = MyHTMLParser(strict=False) 
parser.feed(source) 

我們的問題:

  1. 爲何類HTMLparser已經被擺在首位叫什麼?

  2. 爲什麼函數handle_data被調用,該函數是如何工作的?

  3. 爲什麼global y儘管y是在類本身?

回答

1
  1. 它不會被調用;你是從它繼承而來的;調用MyHTMLParser來創建該類的一個實例。

  2. handle_data()HTMLParser代碼調用;您的子類將覆蓋它以處理文檔中的文本數據。通過在您的MyHTMLParser實例上調用.feed()該過程開始。

    查看完整API的html.parser module文檔。如果你真的想知道這一切如何工作,你可以嘗試瞭解full html.parser source code

  3. 你發現的例子其實是在做相當錯誤的事情。 global y指的是不同的y變量,它位於模塊範圍內。該行顯示該示例的原始開發人員不理解他們在做什麼。 global y線不是唯一的例子;代碼可以通過其他方式製造更多Pythonic。

    該類別範圍內的y定義未使用。該handle_data()方法應該是指self.y代替:

    class MyHTMLParser(HTMLParser): 
        y = None 
    
        def handle_data(self, data): 
         if '\\' not in data: 
          if data == str1: 
           print("Name of professor:", data) 
           print("Name of course:", self.y) 
          self.y = x 
    

    此存儲每個元素在self.y元素文本,如果下一個元素的str1全局變量相匹配,然後打印出來的好,再加上教授的名字。

您可能想要考慮使用BeautifulSoup來代替更直觀的HTML解析器API。