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()))