24. Python脚本学习笔记二十四屏幕抓取

24. Python脚本学习笔记二十四屏幕抓取

本篇名言:“静坐常思己过,闲谈莫论人非,能受苦乃为志士,肯吃亏不是痴人,敬君子方显有德,怕小人不算无能,退一步天高地阔,知足者人心常乐!”

                  屏幕抓取是程序下载网页并且提取信息的过程。可以在程序中使用在线的网页中所包含的信息。如果是动态网页就更加有用。

                  可以使用urllib库获取网页的HTML源代码,然后使用正则表达式提取需要的信息。不过这样实现存在几个问题:正则表达式不是完全可读,对于某些HTML特性无法处理,被HTML源码约束等。

                  可以使用Tidy的程序和XHTML解析或者使用BeautifulSoup库。

1.  Tidy和XHTML解析

XHTML是HMTL的最新方言,是XML的一种形式。

Tidy是用来修复不规范且随意的HTML工具。能以相当智能的方法修复一般的错误。

                  解析从Tidy中获得表现良好的XHMTL方法是使用HTMLParser
HTMLParser的回调方法如下:

并不需要实现所有的回调函数。

屏幕抓取代码类似如下:

from urllib import urlopen

from HTMLParser import HTMLParser

 

class Scraper(HTMLParser):

 

    in_h3 = False

    in_link = False

 

    def handle_starttag(self,tag, attrs):

        attrs = dict(attrs)

        if tag == 'h3':

            self.in_h3 = True

 

        if tag == 'a' and'href' in attrs:

            self.in_link = True

            self.chunks = []

            self.url =attrs['href']

 

    def handle_data(self,data):

        if self.in_link:

           self.chunks.append(data)

 

    def handle_endtag(self,tag):

        if tag == 'h3':

            self.in_h3 = False

        if tag == 'a':

            if self.in_h3 andself.in_link:

                print '%s (%s)'% (''.join(self.chunks), self.url)

            self.in_link =False

 

text = urlopen('http://python.org/community/jobs').read()

parser = Scraper()

parser.feed(text)

parser.close()

代码比用正则表达式要长,不过对于复杂的提取工作可能会体现出优势。

2.  Beautiful Soup库

这个BeautifulSoup是小模块,用来解析和检查经常在网上看到的那类乱七八糟而且不规范的HTML。

http://www.crummy.com/software/BeautifulSoup/下载压缩包

然后解压到python的安装目录。

然后进入到解压目录,执行python setup.py install即可完成安装。

执行代码参考如下:

fromurllib import urlopen

frombs4 import BeautifulSoup

 

text = urlopen('http://python.org/community/jobs').read()

soup = BeautifulSoup(text)

 

jobs = set()

forheader in soup('h3'):

   links = header('a', 'reference')

   ifnot links: continue

   link = links[0]

   jobs.add('%s (%s)' % (link.string, link['href']))

 

print'\n'.join(sorted(jobs, key=lambda s: s.lower()))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值