本文主要是介绍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 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 = Truedef 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 = Truedef 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爬虫常用HTMLParser的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!