Python使用HTMLParser抓取网页内容

  昨天使用webdriver爬取了某电商网站的商品数据信息,webdriver其实是使用DOM格式来抓取网页数据的。但是使用DOM格式有一个问题,学过前端的同学都知道,如果使用DOM格式抓取数据,必须要等到DOM树形成之后才可以,也就是说DOM格式要完全完成之后才可以使用。但是对于某些特殊的情况,并不需要全部的DOM,可能只需要DOM中的一部分就可以了。在这种情况下webdriver就会显得效率有点低了。

今天使用另一种方式来抓取网页中的内容,HTMLParser。HTMLParser使用了SAX这种数据流的方式来抓取网页中的内容,解析一句,处理一句,不再是等DOM树结构形成之后才处理。SAX的全称是“Simple API for XML”,其实它是用来处理XML格式的数据的。但是HTML与XML在格式上有很多相似的地方,因此也可以用它来处理HTML语言。当然HTML与XML还是有很多不一样的地方,例如XML要求每个标签必须严格闭合,但是HTML就没有这样的要求,HTML还是比较随意的,它经常会出现类似于
这样的标签,对于这样的标签,我们可以另行处理。

首先还是准备工作

  • 安装HTMLParser
     pip install HTMLParser

  • 安装好之后如果直接运行,此时会报一个错误,No module named markupbase。这是因为markupbase是Python2的模块,而在Python3中换成了_markupbase。这可是一个巨大的坑,我在这里卡住了好长时间,在网上也搜了一些办法,基本上有两个办法:第一个就是在官网上找到markupbase.py这个文件,下载下来,copy到与HTMLParser.py同一个目录下。我的目录是C:\Users\wilson\AppData\Local\Programs\Python\Python36\Lib\site-packages。仅供大家参考。
 第二个方法要简单一些,找到该目录C:\Users\wilson\AppData\Local\Programs\Python\Python36\Lib\site-packages下的HTMLParser.py文件,然后把里面所有的markupbase都换成_markupbase,这样就不会再出现上述的问题。

 好了,准备工作已经做好了,在上python代码之前,我需要先做一个简单Hello.html文件,用python来抓取这个文件所有DOM。下面是Hello.html



	Hello html


	wilson is so good

非常简单的html文件,主要还是要看HTMLParser是如何抓取的。
# -*- coding:utf-8 -*-
import io
import sys
from HTMLParser import HTMLParser
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')


class NewParser(HTMLParser):       #继承基类HTMLParser,同时改写基类几个函数,主要还是为了打印的目的。Sax模式
  def handle_decl(self, decl):
    HTMLParser.handle_decl(self, decl)
    print('decl %s' % decl)

  def handle_starttag(self, tag, attrs):
    HTMLParser.handle_starttag(self, tag, attrs)
    print('<' + tag + '>')

  def handle_endtag(self, tag):
    HTMLParser.handle_endtag(self, tag)
    print('')

  def handle_data(self, data):
    HTMLParser.handle_data(self, data)
    print('data %s' % data)

  #下面的代码是处理类似于
这样的没有闭合的标签 def handle_startendtag(self, tag, attrs): HTMLParser.handle_startendtag(self, tag, attrs) def handle_comment(self, data): HTMLParser.handle_comment(self, data) print('data %s' % data) def close(self): HTMLParser.close(self) print('Close') HTMLdemo = NewParser()
HTMLdemo.feed(open('hello.html').read())
HTMLdemo.close()


上面的代码其实就是继承基类HTMLParser,同时对几个基本函数进行改写,增加打印函数,方便调试。运行结果如下
  Python使用HTMLParser抓取网页内容_第1张图片

    结果就是将DOM树中所有的标签都识别出来,并且打印。这样我们就可以根据不同标签,不同内容来抓取我们需要的数据。
以上就是今天的所有内容。
与您共勉!

你可能感兴趣的:(爬虫)