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. c++ 一个类使用另外一个类的变量或方法

    如:a.cpp 声明 int a=9; 要在b.cpp文件中使用变量 a extern int a; int b=1; cout<<a+b; 结果为10;

  2. distinguish and differentiate

    According to Cambridge Dictionary distinguish:to recognize or understand the difference between two ...

  3. PreferenceActivity使用方法

              public class MainActivity extends Activity { @Override protected void onCreate(Bundle save ...

  4. Free Candies

    题意: 有4堆东西,每堆有n个每个有一个颜色,现在有一个篮子最多能装5个不同的颜色的东西,每次都从堆顶拿,当篮子出现两个相同颜色,可以获得这两个东西,求获得的最大数量 分析: 因为就4推,可以把各堆的 ...

  5. 【LeetCode】198 - House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  6. PHP 关于回调的用法

    class aClass { public static function directWrite($message) { echo 'this is a static function from a ...

  7. bzoj3714: [PA2014]Kuglarz

    [PA2014]KuglarzTime Limit: 20 Sec Memory Limit: 128 MBSubmit: 553 Solved: 317[Submit][Status][Discus ...

  8. Strider 持续集成(gitlab)

    Strider安装后运行: Mac: strider Ubuntu: bin/strider 本地运行时浏览器访问: http://127.0.0.1:3000 其他服务器:服务器地址 + 端口号(3 ...

  9. 【132】iPad使用相关问题

    1.想iPad中导入音乐文件,保留原音乐文件名称 [方法]需要删除音乐文件中的“标题”和“参与创作的艺术家”,直接删除的话,效率比较低,需要借助一款软件——foobar2000,选中导入的文件,然后属 ...

  10. 【全面完美方案】iPhone 4S WiFi变灰 DIY修复方式

    这是我在一位台湾网友usaretama发表的一篇帖子中看到的,原帖我发表在维维网 如果你有WiFi开关变灰不能切换.WiFi遇到搜不到AP或搜到了连不上,那您就要注意这篇了. 家人的 iPhone 4 ...