HTMLParser介绍 HTMLParser是Python自带的模块,能够很容易的实现HTML文件的分析。使用时需要定义一个HTMLParser的子类,并重写部分函数来实现自己想要的功能,例如: handle_starttag(tag, attrs)handle_endtag(tag, attrs)handle_endtag(tag) tag是的html

HTMLParser介绍

HTMLParser是Python自带的模块,能够很容易的实现HTML文件的分析。

使用时需要定义一个HTMLParser的子类,并重写部分函数来实现自己想要的功能,例如:

handle_starttag(tag, attrs)

handle_endtag(tag, attrs)

handle_endtag(tag)

tag是的html标签,attrs是 (属性,值)元组(tuple)的列表(list).

HTMLParser自动将tag和attrs都转为小写,例如:

tag : h1, attrs : [(u'id', u'header-h'), (u'class', u'left')]

tag : a, attrs : [(u'href', u'/')]

data : Netxfly

data : s Blog

tag : a

tag : h1

data :

一个简单的爬虫

按上面的介绍写一个简单的爬虫,代码如下:

import requests

from HTMLParser import HTMLParser

class HTMLParserTest(HTMLParser):

def __init__(self):

HTMLParser.__init__(self)

def handle_starttag(self, tag, attrs):

print "tag : %s, attrs : %s" % (tag, attrs)

def handle_endtag(self, tag):

print "tag : %s" % tag

def handle_data(self, data):

print "data : %s " % data.encode('utf-8')

if __name__ == '__main__':

url = 'http://www.xsec.io/'

html = requests.get(url).text

hp = HTMLParserTest()

hp.feed(html)

保存链接的tag

运行上面的demo后,根据输出的内容,可以确定以后tag中是带有超链接信息的:

- link

tag : link, attrs : [(u'rel', u'stylesheet'), (u'href', u'http://libs.baidu.com/fontawesome/4.0.3/css/font-awesome.min.css')]

script

tag : script, attrs : [(u'src', u'http://libs.baidu.com/jquery/1.8.3/jquery.min.js')]

a

tag : a, attrs : [(u'href', u'/article/38/thread_return_value.html#comment')]

img

tag : img, attrs : [(u'src', u'/static/img/site.png'), (u'alt', u'site'), (u'id', u'header-img'), (u'class', u'left')]

form

start tag : form, attrs : [(u'id', u'comment-form'), (u'class', u'hide clear text-center form'), (u'action', u'/comment/38/'), (u'method', u'post')]

最终的爬虫

我们的爬虫暂时只需要关注上面的几种tag,根据attrs中的值,过滤出URL即可,如下所示:

class HTMLParserTest(HTMLParser):

def __init__(self):

HTMLParser.__init__(self)

self.links = []

def handle_starttag(self, tag, attrs):

# print tag, attrs, type(attrs)

if tag == 'link':

for (k, v) in attrs:

if k == 'href':

self.links.append(

dict(

link = v

)

)

if tag == 'script':

for (k, v) in attrs:

if k == 'src':

self.links.append(

dict(

script = v

)

)

if tag == 'a':

for k, v in attrs:

if k == 'href':

self.links.append(

dict(

a = v

)

)

if tag == 'img':

for k, v in attrs:

if k == 'src':

self.links.append(

dict(

img = v

)

)

if tag == 'form':

for k, v in attrs:

if k == 'action':

self.links.append(

dict(

form = v

)

)

python爬虫html、parser_利用python HTMLParser标准库实现一个简单的爬虫相关推荐

  1. python爬虫入门教程(二):开始一个简单的爬虫

    2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...

  2. $python爬虫系列(1)——一个简单的爬虫实例

    本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容: 分析html ...

  3. Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名、合并两个不同路径下图片文件名等目录/路径案例、正确加载图片路径)之详细攻略

    Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名.合并两个不同路径下图片文件名等目录/路径案例.正确加载图片路径)之详细攻略 目录 利用python ...

  4. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法

    Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...

  5. 用python做数据分析pdf_利用python进行数据分析pdf

    利用python进行数据分析pdf微盘下载!<利用python进行数据分析>利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接 ...

  6. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

  7. python秒表模块_利用python的kivy模块做一个秒表

    Kiy是一个开源的Python模块库,用于开发界面应用程序和其它采用自然用户界面的多点触控应用软件.它可以在Android,iOS,Linux,OS X和Windows执行,是一款有趣跨平台的模块库. ...

  8. 四句话让你学会一个简单的爬虫【python】

    首先我们先导入request库,这样才能调用requests里面的函数 os库是为了存放我们爬过来的文件 import requests import os 如何四句话实现一个简单的爬虫 pic = ...

  9. 网络爬虫笔记 :一个简单的爬虫框架

    学了两节课的 Python 爬虫,也算是入门了吧.敲了两天的案例代码之后,我突然发现,这些代码虽然功能不同,写法各异,但是终归是有章可循的,整体框架是一致的.所以我自己整理了一个简单的爬虫框架,适合初 ...

  10. 利用WCF的callback机制开发一个简单的多人游戏模型

    本文介绍了如何利用WCF和callback机制开发一个简单的多人在线游戏模型. 运行过程如下: 当game service 启动之后,若干个客户端便会自动连接到服务器.当某个客户端点击join gam ...

最新文章

  1. 人人直播带货的时代,推荐模型为什么比不过李佳琦们?
  2. pre使页面正确显示文本格式
  3. java 事务处理 是不是aop思想_理解原生JAVA AOP思想
  4. FairMOT实时多目标跟踪
  5. 模块怎么用_IC设计方法:模块划分与overdesign
  6. All CUDA devices are used for display and cannot be used while debugging.
  7. SpringMVC 、Struts的区别
  8. android 键盘遮盖输入框_Android各种键盘挡住输入框解决办法
  9. 刷爆了!GitHub标星1.6W,这个 Python 项目太实用!
  10. 在Linux中快速安装Docker
  11. 【数据库基础知识】plsql安装及配置
  12. 每个人心中都有一片极乐净土
  13. vs201检查更新不成功_Kubernetes玩转Pod滚动更新123
  14. TCP、UDP、Socket、HTTP网络编程面试题(总结最全面的面试题)
  15. 按需使用vue-cli-plugin-element插件
  16. “橙子”还是“橙汁”,这是一个问题
  17. 关于Palantir -第五部分:浏览器应用
  18. 【蓝桥杯】——七段数码管的运用
  19. 冯提出的计算机工作原理是,冯诺依曼提出的计算机的基本工作原理是什么
  20. 关于Selenium3在MicrosoftEdge浏览器中出现的问题

热门文章

  1. sqlite3 判断数据库和表的状态
  2. 基于raphael 的图形变化
  3. 【Spring-tx】ProxyTransactionManagementConfiguration类
  4. CompletableFuture 使用详解
  5. 计算机网络的简单概述以及在浏览器中输入一个网址后如何执行
  6. Redis分布式锁为什么要设置超时时间
  7. 飞天技术汇大视频专场:全民视频时代下的创新技术之路
  8. Spring MVC中的统一异常处理
  9. 新手必看——JAVA排序详解(冒泡排序和插入排序)
  10. [C#][共享网络] Netsh命令实现共享,并查询连接用户