回顾

在《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,我们需要在前加一个,以保证是在新闻内容结束的处截断。