Python抓取页面中超链接(URL)的3中方法比较(HTMLParser、pyquery、正则表达式)

HTMLParser版:
#!/usr/bin/python # -*- coding: UTF-8 -*- import HTMLParser
class UrlParser(HTMLParser.HTMLParser):     def__init__(self):         HTMLParser.HTMLParser.__init__(self)         self.urls = []     def handle_starttag(self, tag, attrs):         if tag == 'a':             for name,value in attrs:                 if name == 'href':                     self.urls.append(value)     def geturls(self):         return self.urls
if__name__ == '__main__':     urls = []     url = UrlParser()     url.feed('1111111111<a href="http://www.bccn.net">BCCN</a>2222222<a  href="http://bbs.bccn.net">BCCN.BBS</a>333333333')     urls += url.geturls()     print urls
 
pyquery版:
#!/usr/bin/python # -*- coding: UTF-8 -*- from pyquery import PyQuery as pq
class UrlParser():     def__init__(self):         self.urls = []     def feed(self,data):         d = pq(data)         if d.find('a'):             #关于下面一行,我用d('a').attr('href')只能得到第一个URL,暂时只会用map,不知道有没有别的够pythonic的代码            url = d('a').map(lambda i, e: pq(e)('a').attr('href'))             for u in url:                 self.urls.append(u)     def geturls(self):         return self.urls
if__name__ == '__main__':     urls = []     url = UrlParser()     url.feed('1111111111<a href="http://www.bccn.net">BCCN</a>2222222<a  href="http://bbs.bccn.net">BCCN.BBS</a>333333333')     urls += url.geturls()     print urls
 
正则表达式版:
#!/usr/bin/python # -*- coding: UTF-8 -*- import re
class UrlParser():     def__init__(self):         self.urls = []     def feed(self,data):         url = re.findall(r'''<a(\s*)(.*?)(\s*)href(\s*)=(\s*)([\"\s]*)([^\"\']+?)([\"\s]+)(.*?)>''',data,re.S|re.I)         for u in url:             self.urls.append(u[6])     def geturls(self):         return self.urls
if__name__ == '__main__':     urls = []     url = UrlParser()     url.feed('1111111111<a href="http://www.bccn.net">BCCN</a>2222222<a  href="http://bbs.bccn.net">BCCN.BBS</a>333333333')     urls += url.geturls()     print urls
 
 
速度比较:正则表达式 > pyquery > HTMLParser
测试的时候遍历大约1000个页面,正则表达式占绝对优势,这3个速度比例大约是 8:2:1
HTMLParser最慢,pyquery速度大约是它的2倍,正则的速度是它的8倍,看来以后如非必要不再考虑HTMLParser了,用起 来也不如pyquery方便,正则速度倒是很快,功能也强大,前两者能提取的内容用正则全部都能实现,而正则能实现的功能前两者就不一定能实现了。只是正 则的可读性不好。以后遇到数据量大的用正则表达式,数据量不大不考虑时间因素但逻辑复杂的的用pyquery,以后维护起来方便Python抓取页面中超链接(URL)的三中方法比较(HTMLParser、pyquery、正则表达式)

Python抓取页面中超链接(URL)的三中方法比较(HTMLParser、pyquery、正则表达式) <转>的更多相关文章

  1. 浅谈如何使用python抓取网页中的动态数据

    我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到 ...

  2. 使用PHP的正则抓取页面中的网址

    最近有一个任务,从页面中抓取页面中所有的链接,当然使用PHP正则表达式是最方便的办法.要写出正则表达式,就要先总结出模式,那么页面中的链接会有几种形式呢?   链接也就是超级链接,是从一个元素(文字. ...

  3. curl抓取页面时遇到重定向的解决方法

    用php的curl抓取网页遇到了问题,为阐述方便,将代码简化如下: <?php function curlGet($url) { $ch = curl_init(); curl_setopt($ ...

  4. 利用python抓取页面数据

    1.首先是安装python(注意python3.X和python2.X是不兼容的,我们最好用python3.X) 安装方法:安装python 2.安装成功后,再进行我们需要的插件安装.(这里我们需要用 ...

  5. Python抓取网页中的图片到本地

    今天在网上找了个从网页中通过图片URL,抓取图片并保存到本地的例子: #!/usr/bin/env python # -*- coding:utf- -*- # Author: xixihuang # ...

  6. python抓取网页中的动态数据

    一.概念 网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念,动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到浏览器 ...

  7. 通过CURL抓取页面中的图片路径并下载到本地

    1.首页是图片处理页面downpic.php <?phpfunction getImage($url,$filename="") { if($url=="" ...

  8. 点滴积累【C#】---抓取页面中想要的数据

    效果: 描述:此功能是抓取外国的一个检测PM2.5的网站.实时读取网站的数据,然后保存到数据库里面.每隔一小时刷新一次. 地址为:http://beijing.usembassy-china.org. ...

  9. python抓取网页中图片并保存到本地

    #-*-coding:utf-8-*- import os import uuid import urllib2 import cookielib '''获取文件后缀名''' def get_file ...

随机推荐

  1. Eziriz.Net.Reactor使用注意事项

    1) 保护参数配置 2) 注册表访问 using System.Security.Permissions; [RegistryPermissionAttribute(SecurityAction.Pe ...

  2. @错误抑制运算符和or die()

    1.错误抑制运算符可在任何表达式前使用,PHP支持一个错误抑制运算符@.当将其放置在一个PHP表达式之前,则该表达式可能产生的任何错误信息都被忽略掉.@运算符只对表达式有效. 2.or die() 当 ...

  3. IOS-简单计时器的使用

    1. 使用NSTimer *_timer --游戏计时器 2. NSDate *_startTime -- 开始时间 3. 初始化计时器 _timer = [NSTimer scheduledTime ...

  4. R 安装与环境配置

    R语言是一种很方便的应用于科学计算的语言,推荐给大家学习. 由于R的版本对程序包的兼容有些问题,推荐使用2.15.3. 下面给出下载链接,安装一路默认即可,可以自己更存放目录,其他的都没有影响.下面是 ...

  5. Chapter14:重载运算符

    对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数. int operator+(int, int);//错误,不能为int重定义内置运算符 对于一个重载的运算符来说,其优先级和结 ...

  6. no symbol version for module_layout

    内核模块编译helloworld: no symbol version for module_layout, 尝试各种解决办法, 都没搞定, 版本也是对的. dmesg提示no symbol vers ...

  7. MVC&amp;&amp;MVP

    Classic MVC Classic MVC 大概上世纪七十年代,Xerox PARC的Trygve提出了MVC的概念. 并应用在Smalltalk系统中,为了和其它类型的MVC加以区分,历史上习惯 ...

  8. MVC&&MVP

    Classic MVC Classic MVC 大概上世纪七十年代,Xerox PARC的Trygve提出了MVC的概念. 并应用在Smalltalk系统中,为了和其它类型的MVC加以区分,历史上习惯 ...

  9. CSS抗锯齿 font-smoothing

    CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ...

  10. linux nginx安装(转载)

    1.linux 下面安装 1.下载 pcre-8.10.tar.gz  nginx-1.1.1.tar.gz 2.安装 pcre 让nginx支持rewrite pcre-8.10.tar.gz  上 ...