Python爬蟲常用之HtmlParser


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 HTMLParser


class 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 = False

def 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 = False

def 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)    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM