Python进阶记录之HTMLParser模块

论坛 期权论坛 期权     
想进化的猿   2019-6-30 05:55   2353   0
回顾      在《Python进阶记录之urllib模块》中,我们介绍了Python内置的HTTP请求库urllib模块的基本用法,需要重点掌握使用urllib的request模块进行简单的get、post请求。今天我们讲一下Python内置的HTML解析库HTMLParser模块,并结合之前的re模块和urllib模块实现爬取指定新闻页提取新闻文本内容的小需求。
HTMLParser模块简介      我们使用urllib模块进行HTTP请求获取到的是整个网页的HTML,但是我们往往只需要其中一部分对我们有用的内容。这时我们就可以使用HTMLParser模块来帮助我们处理HTML。
      HTMLParser是Python内置的专门用来解析HTML的模块。利用HTMLParser,我们可以分析出一段HTML里面的标签、数据等,是一种处理HTML的简便途径。我们先来看一个官方的例子。


HTMLParser模块官方例子
      从上述代码中可以看出,HTMLParser模块来自html.parser,导包时要格外注意。使用HTMLParser时,我们需要定义一个继承自HTMLParser的子类,并根据需要重写HTMLParser父类中的成员方法。例子中使用的各方法作用如下:
      handle_starttag(tag, attrs):识别HTML的开始标签,例如、、、等。
      handle_endtag(tag):识别HTML的结束标签,例如、、、等。
      handle_data(data):识别HTML标签内容,例如“Test”中的Test。
      handle_startendtag(tag, attrs):识别没有结束标签的HTML标签,例如等。
      handle_comment(data):识别HTML中的注释内容,一般是“”中的注释内容。
      HTMLParser采用的是一种事件驱动的模式,HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。
      我们可以利用这些方法来实现HTML解析相关的功能。其中参数tag表示的是HTML标签,attrs是一个列表,列表元素为一个个“(属性,值)”形式的元组。HTMLParser会自动将tag和attrs都转为小写,解析时调用feed( )方法,把待解析的HTML字符串传入即可。
HTMLParser模块的简单应用      现在有以下网页,我们需要获取出里面的新闻文本内容。


待请求网页
      首先就是获取该网页的HTML。经过上节内容的学习,我们很容易想到利用urllib库请求获取这个网页的HTML。


获取网页HTML
      代码很简单,使用urlopen( )方法,传入url即可。此时,我们已经得到了整个网页的HTML,但是我们要获取的是新闻内容,显然此时的HTML中有太多我们不需要的东西。
      观察整个网页HTML,我们发现新闻内容是包含在一个div中的。


新闻内容相关HTML
      我们可以使用正则表达式re模块将包含新闻内容的这个div提取出来。


提取新闻内容相关的HTML
      新闻内容的div格式主要是:...。由于该div下嵌套了其他div,如果我们直接使用r'(.*?)'进行正则提取,会发现在下一个处就截断了。为了正确提取所有新闻内容相关的HTML,我们需要在前加一个,以保证是在新闻内容结束的处截断。
      此时,我们已经得到了新闻内容相关的HTML。现在还剩最后一步,就是把HTML标签去掉,保留新闻文本内容。这一步,我们就可以利用HTMLParser来实现了。


HTMLParser提取新闻内容
      我们定义一个继承自HTMLParser的子类,然后重写handle_data(data)方法获取当前HTML中的文本内容即可。由于我们定义的私有变量__text是通过一个列表来逐条接收新闻内容的,所以我们在类中定义一个获取私有变量__text的方法,并将列表转换成字符串。至此,我们已经获取到了新闻的文本内容。
      然而,当前文本内容一整段在一起,看起来并不美观,与实际分段的新闻文本内容也有差别。我们可以使用HTMLParser来美化新闻内容。我们知道,网页上的新闻内容是通过“ ”、“ ”、“”等特殊符号或标签进行间隔和分段的。因此,我们只需要在解析时替换掉这些特殊符号和标签即可。

替换特殊符号和标签
      重写handle_data(data)方法,识别文本的同时替换掉“ ”、“ ”、“ ”等特殊字符;重写handle_starttag(tag, attrs)方法,识别出、进行替换;重写handle_startendtag(tag, attrs)方法,识别出进行替换。再次运行程序,可以看到,新闻内容进行了分段,看起来就美观多了。
      上述过程实现了一个非常简单的爬虫,爬取新闻网页,提取新闻内容。当然,由于我们目前还没介绍其他第三方库,实现起来还不够灵活,例如获取新闻内容的div我们现在只能通过正则表达式实现,但实际上,如果使用lxml(etree、xpath)、BeautifulSoup等第三方库会更简单实用。
总结      以上内容介绍了Python内置的HTML解析库HTMLParser模块,需要重点掌握HTMLParser类常用方法的作用,能够重写这些方法进行自定义解析。感谢大家的支持与关注,欢迎一起学习交流~

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP