正则表达式
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
关于贪婪和非贪婪
http://www.runoob.com/regexp/regexp-syntax.html
re模块
- re.findall() 在目标字符串查找符合规则的字符串
- re.sub() 替换
- re.compile 把正则表达式编译成一个正则对象
e.g. 1
利用正则表达式抓取页面内容
注意python3的解码问题
import requests
import re
url = 'http://book.douban.com/series/1163?page=11'
re_extract = re.compile('<a href="(.*?)" title="(.*?)"[\S\s]*?class="pub">([\S\s]*?)<\/div>')
page = requests.get(url)
item_match = re.findall(re_extract, page.content.decode())
if item_match:
for item_info in item_match:
#print (item_info)
print (item_info[0])
print (item_info[1])
print (item_info[2].strip(), '\n')
e.g. 2
一个正则调试工具:
- .*? 一般用于(?)在两个确定表达式之间表示
- ( ) 中的表达式作为分组,每遇到一个编号+1
- 避免在样式里面提取,在属性里提取
- html转义(eg. ‘ ’) 和 正则转义 的不同
import re
import requests
url = 'http://www.mtime.com/hotest'
page = requests.get(url)
re_extract = re.compile('<div class="picbox">.*?<img src="(.*?)".*?<a href="(.*?)" target="_blank">(.*?)</a>.*?导演:\s*(.*?)</li>.*?主演:\s*(.*?)</li>.*?</div>')
item_match = re.findall(re_extract, page.content.decode())
if item_match:
for info_list in item_match[:3]:
for item_info in info_list:
item_info_r = re.sub('\s*<\/?a.*?>\s*', '', item_info)
item_info_r = re.sub('\s+', ' ', item_info_r)
print (item_info_r.replace(' ', ' '))
print ('\n')