2014-10-16 18 views
0

我有一個不使用任何外部庫或包(例如Beautiful Soup等)的HTML解析器。它的工作原理在這裏它接受一個命令行html文件,並只返回文本。Python:僅使用我的HTML解析器返回hosts/a href

我想修改它,或者讓它有一個函數,即只返回主機名,比如HOST「HOST」>標籤;有它僅返回主機,只有頂層目錄的像「stackoverflow.com」等

class _DeHTMLParser(HTMLParser): 
def __init__(self): 
    HTMLParser.__init__(self) 
    self.__text = [] 

def handle_data(self, data): 
    text = data.strip() 
    if len(text) > 0: 
     text = sub('[ \t\r\n]+', ' ', text) #probably alter here? 
     self.__text.append(text + ' ') 

def handle_starttag(self, tag, attrs): 
    if tag == 'p': 
     self.__text.append('\n\n') 
    elif tag == 'br': 
     self.__text.append('\n') 

def handle_startendtag(self, tag, attrs): 
    if tag == 'br': 
     self.__text.append('\n\n') 

def text(self): 
    return ''.join(self.__text).strip() 


def dehtml(): #have it pass line? 
    try: 
     parser = _DeHTMLParser() 

     f = open(sys.argv[1], 'r') #not argv[1] but stdin all? 
     text = f.read() 
     f.close() 

     parser.feed(text) 
     parser.close() 
     return parser.text() 
    except: 
     print_exc(file=stderr) 
     return text 

現在我可以調用dehtml(),它運行返回文本只/無標籤的版本。

爲了讓嘗試也打印出來的主機,我已將此添加變形點焊handle_starttag

if tag == 'a href': 
     self.__text.append() 

,看它是否會作爲第一次嘗試,還追加了主機名,但沒有運氣。我相信這個問題是在我的handle_data部分,特別是在正則表達式位 - 這是正確的嗎?

+0

什麼是你的實際問題呢? – 2014-10-16 15:14:51

+0

@PaulCollingwood如果不清楚,我表示歉意。現在它返回標籤之外的文本,我希望它,而不是作爲一個附加功能,只返回* href標籤內的主機名*,例如返回HOST在 link user3295674 2014-10-16 15:19:48

+0

我應該做些什麼,內部handle_starttag,如果標籤==一個href然後打印? – user3295674 2014-10-16 15:21:46

回答

0

handle_starttag方法具有跟蹤主機所需的所有信息。您需要解析的網址,以便將其添加到頂部

from urlparse import urlparse 

然後添加一個容器,以便容納主機時初始化

def __init__(self): 
    HTMLParser.__init__(self) 
    self.__text = [] 
    self.hosts = set() 

然後抓住主機,當你在一個STARTTAG。 (編輯:錯誤地使用ATTR作爲字典

def handle_starttag(self, tag, attrs): 
    if tag == 'p': 
     self.__text.append('\n\n') 
    elif tag == 'br': 
     self.__text.append('\n') 
    elif tag == 'a': 
     for name, value in attrs: 
      if name == 'href': 
       self.hosts.add(urlparse(value).netloc.split(':')[0].lower()) 
       break 
+0

謝謝,我試過這個,但是它仍然不會打印出主機,它完全忽略了文件中的標籤。思考? – user3295674 2014-10-16 16:18:05

+0

我有'handle_starttag'中的一個錯誤,應該觸發你的異常處理程序。修復之後,我成功添加了來自標籤的主機。你可以打印'parser.hosts'來看看那裏有什麼。 – tdelaney 2014-10-16 16:51:59

+0

有趣的是,未糾正的沒有引發異常。我嘗試了更正後的版本,並在handle_starttag self.hosts.add(urlparse(attrs ['href'])。netloc.split(':')[0] .lower'獲得了「File」tohosts.py「 ()) TypeError:列表索引必須是整數,而不是str「 – user3295674 2014-10-16 17:21:35