使用HTMLParser解析器爬取网页内容

来源:互联网 发布:点歌软件 编辑:程序博客网 时间:2024/05/19 00:14

相关模块的安装

  • 1.安装requests 模块,在终端输入pip install requests 命令。使用requests 模块进行http请求,同时导入HTMLParser和re模块。
    这里写图片描述
    为了解决编码带来的困扰,默认使用utf8编码。

解析网页内容

  • 1.网页的url是http://www.gushiwen.org/gushi/tangshi.aspx ,该网页是个唐诗300首网页,里面有唐诗300首的标题和作者,点击某首唐诗进入其具体内容网页。我们想要抓取的内容是标题、作者、内容。
  • 2.利用谷歌的chrome浏览器查看网页源代码。需要抓取的源代码如下:
    这里写图片描述

    打开其中的一个div标签,显示如下:
    这里写图片描述
    所以我们先抓取外层的div标签,这几个并列的div标签都有一个class属性为guwencont2,识别出外层的标签后就可以抓取内层的a标签的内容,包含古诗的标题和作者。还需要抓取该古诗的url,即为href属性值,例如/GuShiWen_6299b969fb.aspx,该内容拼接原始url为http://www.gushiwen.orghttp://www.gushiwen.org/GuShiWen_6299b969fb.aspx 即为具体内容网页。

  • 3.来到古诗的具体内容网页,同样利用chrome的开发者工具显示源代码,显示如下:
    这里写图片描述
    内容在p标签中,有一个align属性为center。
  • 4.分析完如何解析出标题作者和内容后,开始写代码。自定义一个解释器继承HTMLParser ,在重写初始化函数__init__ 时要先初始化父类

    HTMLParser.__init__(self)

    在初始化函数中定义一个字典,用于存储爬取到的标题作者和内容(1首诗对应一个字典),定义一个列表用于存储字典(列表中存储所有诗对应的字典)。定义几个标志位(用于标记上面分析的几个需要找到的标签),以及一个正则表达式(用于分离标题和作者)
    这里写图片描述

    • 定义一个解析属性函数,html标签中的属性和属性值在htmlparser解析器中是个tuple类型,返回属性名对应的属性值。
      这里写图片描述
    • 重写handle_starttag函数,该函数在查找到标签头自动调用,attrs包含该标签tag中所有的属性和属性值,类型是个列表,其中的元素都是tuple类型(属性名,属性值)。
      这里写图片描述
    • 重写handle_endtag函数,该函数在查找到标签末位自动调用
      这里写图片描述
    • 重写handle_data函数,该函数在查找到标签中的内容自动调用,利用正则表达式进行了匹配,如果匹配成功,匹配出来的组即为标题和作者。
      这里写图片描述
  • 5.实例化上面写的SongciParser类,传入原始url,使用requests 获得响应,把响应的内容喂给实例化的解析器。
    这里写图片描述
    在主函数中执行如下代码
    这里写图片描述

解析具体网页的内容

  • 1.经过上面的解析,已经可以解析出唐诗300首的标题和作者,并且获得了每首古诗的url,接下来进入到具体古诗网页中获取内容。同样需要自定义一个解析器(继承HTMLParser)
    这里写图片描述
  • 2.加载每首古诗的url获取内容,进行了换行处理
    这里写图片描述
    在主函数中调用如下,这个只加载了前10首古诗
    这里写图片描述
    下面是运行的结果
    这里写图片描述
0 0