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