程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

python面试(5)

函数(0)

标签  

函数(0)

列表(0)

日期归档  

Python—解析HTML页面(HTMLParser)

发布于2020-02-10 15:35     阅读(1308)     评论(0)     点赞(21)     收藏(4)


HTMLParser类的定义及常用方法

类的定义

  • HTMLParser主要是用来解析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中注释的处理方法。

解释部分:

  • tag表示的是html标签,attrs是一个列表,列表元素为一个个“(属性,值)”形式的元组。 
  • HTMLParser会自动将tag和attrs都转为小写。

实例应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
try:
    from HTMLParser import HTMLParser
except:
    from html.parser import HTMLParser
 
class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.data = []   # 定义data数组用来存储html中的数据
        self.links = [] 
            
    def handle_starttag(self, tag, attrs):
        print('<%s>' % tag)
        if tag == "a":
            if len(attrs) == 0: pass
            else:
                for (variable, value)  in attrs:
                    if variable == "href":
                        self.links.append(value)
     
    def handle_endtag(self, tag):
        print('</%s>' % tag)
 
    def handle_startendtag(self, tag, attrs):
        print('<%s/>' % tag)
 
    def handle_data(self, data):
        print('data===>', data)
 
    def handle_comment(self, data):
        print('<!--', data, '-->')
 
    def handle_entityref(self, name):
        print('&%s;' % name)
 
    def handle_charref(self, name):
        print('&#%s;' % name)
         
if __name__ == "__main__":
    html_code = '''<html>
            <head>这是头标签</head>
            <body>
                <!-- test html parser -->
                <p>Some <a href=\"#\">html</a> HTML&nbsp;&#1234; Ӓtutorial...<br>END</p>
            </body></html>'''
    parser = MyHTMLParser()
    parser.feed(html_code)
    parser.close()
    print(parser.data)
    print(parser.links)

处理HTML转义字符

在 HTML 中 <、>、& 等字符有特殊含义(<,> 用于标签中,& 用于转义),他们不能在 HTML 代码中直接使用,如果要在网页中显示这些符号,就需要使用 HTML 的转义字符串(Escape Sequence),例如 < 的转义字符是 <,浏览器渲染 HTML 页面时,会自动把转移字符串换成真实字符。

转义字符(Escape Sequence)由三部分组成:第一部分是一个 & 符号,第二部分是实体(Entity)名字,第三部分是一个分号。 比如,要显示小于号(<),就可以写 &lt;。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
html = '&lt;abc&gt;'
 
# 反转义:方式1
try:
    from HTMLParser import HTMLParser
except:
    from html.parser import HTMLParser
html_parser = HTMLParser()
text = html_parser.unescape(html)
print(text)
 
# 反转义:方式2
import html
text = html.unescape('a=1&b=2')
print(text)
 
# 转义
import cgi
html = cgi.escape(text)
print(html)

https://www.liaoxuefeng.com/wiki/897692888725344/966401234683424 

https://www.liaoxuefeng.com/wiki/1016959663602400/1017784593019776

https://baijiahao.baidu.com/s?id=1637614366297669334&wfr=spider&for=pc



所属网站分类: 技术文章 > 博客

作者:皇后娘娘别惹我

链接:https://www.pythonheidong.com/blog/article/230746/91228fb7890baa8f0b4b/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)