轉自博客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 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)

