跳过正文
  1. 文章/
  2. Python/
  3. 爬虫/

4、HTMLParser

·1380 字·3 分钟· loading · loading · ·
Python 爬虫
GradyYoung
作者
GradyYoung
爬虫 - 点击查看当前系列文章
§ 4、HTMLParser 「 当前文章 」
  • HTMLParser是html.parser模块下,主要是用来解析HTML文件(包括HTML中无效的标记)的模块。
  • 参数convert_charrefs表示是否将所有的字符引用自动转化为Unicode形式,Python3.5以后默认是True。
  • HTMLParser可以接收相应的HTML内容,并进行解析,遇到HTML的标签会自动调用相应的handler(处理方法)来处理,用户需要自己创建相应的子类来继承HTMLParser,并且复写相应的handler方法
  • HTMLParser不会检查开始标签和结束标签是否是一对

常见方法与属性
#

方法
#

  • HTMLParser.feed(data):接收一个字符串类型的HTML内容,并进行解析。
  • HTMLParser.close():当遇到文件结束标签后进行的处理方法。如果子类要复写该方法,需要首先调用HTMLParser累的close()。
  • HTMLParser.reset():重置HTMLParser实例,该方法会丢掉未处理的html内容。
  • HTMLParser.getpos():返回当前行和相应的偏移量。
  • HTMLParser.handle_starttag(tag, attrs):对开始标签的处理方法。例如<div id="main">,参数tag指的是div,attrs指的是一个由(name,Value)元组组成的列表。
  • HTMLParser.handle_endtag(tag):对结束标签的处理方法。例如</div>,参数tag指的是div。
  • HTMLParser.handle_startendtag(tag, attrs):识别没有结束标签的HTML标签,例如<img />等。
  • HTMLParser.handle_data(data):对标签之间的数据的处理方法。<tag>test</tag>,data指的是“test”。
  • HTMLParser.handle_comment(data):对HTML中注释的处理方法。

属性
#

  • HTMLParser.lasttag:上一个解析的标签名,是字符串

例子
#

from html.parser import HTMLParser
# 集成HTMLParser,重写方法
class MyHtmlParser(HTMLParser):
    def handle_starttag(self,tag,attrs):
        "开始标签"
        print('%s标签开始' % tag)
        print('%s标签属性:%s' % (tag,attrs))

    def handle_endtag(self, tag):
        "处理结束标签"
        print('%s标签结束' % tag)

    def handle_startendtag(self, tag, attrs):
        "处理自闭和标签"
        print('%s自闭和标签' % tag)
        print('%s标签属性:%s' % (tag,attrs))

    def handle_data(self, data):
        "处理标签间数据"
        print('%s标签间数据为:%s' % (self.lasttag,data))

    def handle_comment(self, data):
        "处理注释"
        print('注释:%s' % data)

    def handle_entityref(self, name):
        print('&%s;' % name)
 
    def handle_charref(self, name):
        print('&#%s;' % name)

html = """
<html>
    <-- 这是注释 -->
    <head>这是头标签</head>
    <body>
        <!-- test html parser -->
        <p>Some <a href=\"#\">html</a> HTML&nbsp;&#1234; Ӓtutorial...<br>END</p>
    </body>
</html>
"""

#解析html字符串
p = MyHtmlParser()
p.feed(html)
#关闭解析
p.close()

转义字符
#

用 Python 来处理转义字符串有多种方式,而且 py2 和 py3 中处理方式不一样,在 python2 中,反转义串的模块是 HTMLParser。

# python2
import HTMLParser
a = HTMLParser().unescape('&lt;abc&gt;')
print(a)
'''
<abc>;
'''

Python3 HTMLParser 模块迁移到了 html.parser

# python3
from html.parser import HTMLParser
a = HTMLParser().unescape('&lt;abc&gt;')
print(a)
'''
<abc>;
'''

到 python3.4 以后的版本,在 html 模块新增了 unescape 方法

# python3.4
import html
a = html.unescape('&lt;abc&gt;')
print(a)
'''
<abc>;
'''
爬虫 - 点击查看当前系列文章
§ 4、HTMLParser 「 当前文章 」