python內建的用於解析HTML的庫HtmlParser

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.