先看简短代码:
#!user/bin/python
# coding: utf-8
import urllib2
import re
#1.
def get_html(url):
req = urllib2.urlopen(url)
content = req.read()
return content.decode('gbk').encode('utf-8')
#2.
def search_div(html):
rp1 = re.compile(r'<div class="nav1">(.*?)</div>', re.S | re.I)
m = re.search(rp1, html)
n = m.group(1)
print n
list1 = []
rp2 = re.compile(r'<a href=".*?">(.*?)</a>')
for i in re.finditer(rp2, n):
list1.append(i.group(1))
return list1
#3.
def save_result(result):
f = open('result.txt', 'w')
for res in result:
f.write(res+'\n')
f.close()
url = 'http://www.sohu.com/'
html = get_html(url)
data = search_div(html)
save_result(data)
代码大致意思是先获取搜狐的html页面,利用正则抓取新闻的标签项,从抓取的标签项中在抓取标题,最后写入 .txt文档中。
代码总共定义了3个函数,功能如上所述。
get_html()函数用于获取搜狐的html页面。用到了urllib2模块,这是最简单的urllib2使用了,http是基于请求和应答机制的,客户端提出请求,服务器端提供应答。urllib2用一个Request对象来映射你提出的http请求,来创建一个Request对象,通过调用urlopen方法病传入Request对象,返回一个response对象,然后在response对象中调用read()方法,所以这个函数中还可以这样写: requset = urllib2.Request(url) response = urllib2.urlopen(request) content = response.read() 。最后返回的content就是html页面,这里涉及到一个转码的问题,python 默认的识别的编码是urf -8 ,搜狐网用的编码是 gbk,不可以直接转换,所以当两个不同编码之间转换时可以先将其中一个转换成unicode,继 而再转换成另一个,具体是 用decode('gbk') 将搜狐的html代码按照‘gbk‘ 编码的形式解码成unicode, 再按照’utf-8’的编码形式编码成’utf-8'
search_div()函数用于抓取匹配需要的代码。用到了re 正则处理的模块。r ' '里面是规则,就用到了个捕获组和最小匹配模式,re.compile方法主要是编译规则,这样可以使规则匹配的更快,这适用于经常要适用的规则,不常使用的规则也可不必编译直接使用。html页面中肯定有很多换行,re.S, re.I选项是使点可以匹配换行空格,且不区别大小写。下面的re.search()方法就是用于与对应的字符串进行匹配了,他返回的是match对象,他与findall的特别之处是 search()当匹配到一个的时候就不在匹配了,而findall会一直匹配下去(且返回的是列表),要想查看search返回的内容就需要调用group(),下面有一个规则,他是从上述抓取的html中匹配需要的标题,因为标题有很多个,所以这里search是不合适的,因为他匹配到第一个就会返回,进而匹配不到下面的标题,这里用到了finditer,他返回的也是match对象,但他是一个一个的把所有符合的都匹配,也可以用findall,但不能把返回的整个列表打印,这样的结果是列表中一串16进制数,只能一个一个的打印,这个函数返回的结果就是我们需要的标题了。
save_result() 就是用来把结果写入到文件的函数。