1. re.complie()
作用:如果需要重复地使用某个正则表达式,那么你可以先将该正则表达式编译成模式对象。complie()函数就帮助我们将正则表达式,编译成为一个pattern对象。
2.re.search(pattern ,string)
regex.search(string[, pos[, endpos]])
pattern = re.compile("d")
>>> result = pattern.search("dog")
>>> result
# Match at index 0 <_sre.SRE_Match object; span=(0, 1), match='d'>
>>> pattern.search("dog", 1)
# No match; search doesn't include
但是他并不会返回你需要的字符串,而是返回存在的范围,这时候,就需要group函数。
>> result.group()
"d"
>> result.start()
"0"
>>result.end()
"1"
>>result.span()
(0,1)
3.re.findall(pattern,string)返回了一个list
注:如果findall中的pattern包含着子组的话,即用小括号圈起来的,就会把子组内容单独圈起来。
如果存在多个子组,那么就会把多个子组组合起来构成元组。
这个时候,为了防止瞎匹配,一般使用(?:的语法进行即可。
3.url.request.urlretrieve(url, filename, reporthook, data)
一般用来直接下载图片,filename为保存的名字。后面参数None即可。
贴吧照片爬取:
from urllib import request
import re
def open_url(url):
req = request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
page = request.urlopen(req)
html =page.read().decode('utf-8')
return html
def get_img(html):
pattern = r'<img class="BDE_Image" src="([^"]+\.jpg)"'#[^"]+表示匹配多个不为^的字符
imglist = re.findall(pattern,html)
for each in imglist:
filename = each.split("/")[-1]
request.urlretrieve(each,filename,None)
if __name__ == '__main__':
url = "http://tieba.baidu.com/p/5921006596"
get_img(open_url(url))