以下的小程序是爬取中工校网标题:
首先,通过分析中工校网新闻的URL发现,http://www.zzti.edu.cn/info/1041/19593.htm最后的19593控制这页数。然后,构建URL,获取想要的新闻信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import urllib.request import urllib.error import re import time while True: page = input('请输入要寻找的新闻页数(小于19596)输入‘q’退出:') if page == 'q': break url = 'http://www.zzti.edu.cn/info/1041/' + str(page) + '.htm' try: req = urllib.request.urlopen(url) html = req.read().decode('utf-8') pattern = re.compile('<td class="titles.*?>(.*?)</td>.*?<div id="vsb_content_500">(.*?)</div>.*?</div>.*?</td>', re.S) items = re.findall(pattern, html) for item in items: print (item[0], item[1]) except urllib.error.URLError as e: if hasattr(e, 'code'): print(e.code) if hasattr(e, 'reason'): print(e.reason) time.sleep(1)
|
items = re.findall(pattern, html) == items = pattern.findall(html)
正则表达式中,“.”的作用是匹配除“\n”以外的任何字符,也就是说,它是在一行中进行匹配。这里的“行”是以“\n”进行区分的。a字符串有每行的末尾有一个“\n”,不过它不可见。
如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配。