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. s:iterator标签的使用

    1.在说明s:iterator标签的使用前,先了解下struts2中的Value Stack. 这里参考了webwork中对Value Stack的描述,由于struts2是在webwork的基础上进 ...

  2. 自己的一个LESS工具函数库

    自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...

  3. GitHub的代码托管和使用方法

    原文  GitHub托管 借助GitHub托管你的项目代码 PS:话说自己注册了GitHub都很久了,却没有怎么去弄,现在系统学习一下,也把自己的学习经历总结下来share给大家,希望大家都能把Git ...

  4. Yii连接多个数据库的方法

    一.配置多数据库 大多数情况下,我们都会采用同一类型的数据库,只是为了缓解压力分成主从或分布式形式而已.声明你可以在 主配置文件 ( main.php )   中里声明其它的数据库连接: <?p ...

  5. MSSQL 查询分组前N条记录

    sql语句中,查询分组中前n条记录的sql语句如下 第一种方法 select * from consultingfeebill awhere n>(select count(*) from co ...

  6. HP-Socket

        HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.D ...

  7. selenium python (二) 元素定位方法

    定位的原则就是:id name class 优先,强烈建议和前端哥哥搞好关系.定位就不是问题:实在不行就xpath和css大部分偶可以定位到. webdriver定位的方法是通过一个By类,By类中有 ...

  8. sql server 数据库的操作

    Technorati 标记: sql截取,sql修改 把一个字段的部分取出来,插入到新字段 1 )  //方法二 sql server修改一个字段中的部分数据  update tablename se ...

  9. python27+django调用数据库

    我用的mysql版,先上无模板的版本,在views里加上 import MySQLdb 然后在下方写函数 def use_databases(request): db = MySQLdb.connec ...

  10. php 高效分页

    mysql.php 获取数据库中的记录,完全个人经验总结,仅供参考!<?php/***PHP+MYSQL数据库基本功能*http://blog.csdn.net/yown*/########## ...