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. js 判断页面是否加载完成

    javascript代码如下: document.onreadystatechange = subSomething; //当页面加载状态改变的时候执行这个方法 function subSomethi ...

  2. git初步使用

    git初步使用 主要目的:使用代码控制工具,练习使用git 1.创建新项目 网址如下: https://github.com/kellyseeme?tab=repositories 注意每个人使用的名 ...

  3. 数往知来 JavaScript<十三>

    一.javaScript 语法:大小写敏感,弱类型(所有类型都用var进行引导.声明) 写在<script></script>标签里  不可以放在title里 var num= ...

  4. 凸包稳定性判断:每条边上是否至少有三点 POJ 1228

    //凸包稳定性判断:每条边上是否至少有三点 // POJ 1228 #include <iostream> #include <cstdio> #include <cst ...

  5. R command

    setwd("D:/Research/code/rcode")    #notice the "/" list.files(getwd()) heisenber ...

  6. fork()函数

    现代操作系统提供的三种构造并发程序的方法: •进程 一个进程实体包括:代码段,数据段, 进程控制块 fork()函数:通过系统调用创建一个与原来一模一样的子线程,[用来处理请求信号,而父进程继续一直处 ...

  7. javascript对象事件绑定方法

    javascript对象事件绑定方法 今天在做对象事件绑定的过程中出现了一点异外情况,由于事件方法是由参数传过来的,需要将当前对象call过去,方便方法体里直接调用this 错误写法 obj.oncl ...

  8. Camera拍照声设定

    在某些国家(比如Japan),为了防止偷拍,强制拍照声是需要从Speaker出来的(即使插入耳机的情况下). 实现该功能比较简单的方法就是将拍照声类型设置为Ringtone 或 Alarm 或 Not ...

  9. js运动 淡入淡出

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Spark给我们带来了什么惊喜?

    Spark的一站式解决方案有很多的优势,具体如下.(1)打造全栈多计算范式的高效数据流水线     Spark支持复杂查询. 在简单的“map”及“reduce”操作之外,Spark还支持SQL查询. ...