標籤:www. star tag sel 方法 http 重寫 rtt tool
轉自部落格https://www.cnblogs.com/masako/p/5868367.html
HtmlParser,顧名思義,是解析Html的一個工具。python內建的。
一、常用屬性和方法介紹
HtmlParser是一個類,在使用時一般繼承它然後重載它的方法,來達到解析出需要的資料的目的。
1.常用屬性:
lasttag,儲存上一個解析的標籤名,是字串。
2.常用方法:
handle_starttag(tag, attrs) ,處理開始標籤,比如<div>;這裡的attrs擷取到的是屬性列表,屬性以元組的方式展示
handle_endtag(tag) ,處理結束標籤,比如</div>
handle_startendtag(tag, attrs) ,處理自己結束的標籤,如<img />
handle_data(data) ,處理資料,標籤之間的文本
handle_comment(data) ,處理注釋,<!-- -->之間的文本
二、基本使用
不多說,上代碼
from html.parser import HTMLParserclass MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): """ recognize start tag, like <div> :param tag: :param attrs: :return: """ print("Encountered a start tag:", tag) def handle_endtag(self, tag): """ recognize end tag, like </div> :param tag: :return: """ print("Encountered an end tag :", tag) def handle_data(self, data): """ recognize data, html content string :param data: :return: """ print("Encountered some data :", data) def handle_startendtag(self, tag, attrs): """ recognize tag that without endtag, like <img /> :param tag: :param attrs: :return: """ print("Encountered startendtag :", tag) def handle_comment(self,data): """ :param data: :return: """ print("Encountered comment :", data)parser = MyHTMLParser()parser.feed(‘<html><head><title>Test</title></head>‘ ‘<body><h1>Parse me!</h1><img src = "" />‘ ‘<!-- comment --></body></html>‘)
以上是根據python手冊寫的基本使用,解析了一個簡單的html。可以運行看看,主要用於瞭解各個函數負責解析的部分,以及解析順序。
三、實用案例
以下的實用案例均在上面的代碼中修改對應函數,每個執行個體都是單獨的。
解析的html如下:
<html> <head> <title>Test</title> </head> <body> <h1>Parse me!</h1> <img src = "" /> <p>A paragraph.</p> <p class = "p_font">A paragraph with class.</p> <!-- comment --> <div> <p>A paragraph in div.</p> </div> </body></html>
1.擷取屬性的函數,是個靜態函數,新增的。直接定義在類中,返回屬性名稱對應的屬性
def _attr(attrlist, attrname): for attr in attrlist: if attr[0] == attrname: return attr[1] return None
2.擷取所有p標籤的文本,最簡單方法只修改handle_data
def handle_data(self, data): if self.lasttag == ‘p‘: print("Encountered p data :", data)
3.擷取css樣式(class)為p_font的p標籤的文本,使用了案例1,增加一個執行個體屬性作為標誌,選取需要的標籤
def __init__(self): HTMLParser.__init__(self) self.flag = Falsedef handle_starttag(self, tag, attrs): if tag == ‘p‘ and _attr(attrs, ‘class‘) == ‘p_font‘: self.flag = True def handle_data(self, data): if self.flag == True: print("Encountered p data :", data)
4.擷取p標籤的屬性列表
def handle_starttag(self, tag, attrs): if tag == ‘p‘: print("Encountered p attrs :", attrs)
5.擷取p標籤的class屬性
def handle_starttag(self, tag, attrs): if tag == ‘p‘ and _attr(attrs, ‘class‘): print("Encountered p class :", _attr(attrs, ‘class‘))
6.擷取div下的p標籤的文本
def __init__(self): HTMLParser.__init__(self) self.in_div = Falsedef handle_starttag(self, tag, attrs): if tag == ‘div‘: self.in_div = True def handle_data(self, data): if self.in_div == True and self.lasttag == ‘p‘: print("Encountered p data :", data)
7.處理注釋中的標籤,若需要的資料在注釋中,使用一般函數解析不到
處理方法為,寫兩個類,繼承HTMLParser。在其中一個類的handle_comment裡執行個體化解析類,和其他標籤一樣解析
這裡的MyHTMLParser可以為基本使用中的MyHTMLParser,或者按需重寫。
class CommentHTMLParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) def handle_comment(self,data): cparser = MyHTMLParser() cparser.feed(data)
python內建的用於解析HTML的庫HtmlParser