首页 » PHP教程 » phpimgsrc正则表达式技巧_python|若何理解及精确构建一个关于图片链接的正则表达式

phpimgsrc正则表达式技巧_python|若何理解及精确构建一个关于图片链接的正则表达式

访客 2024-11-09 0

扫一扫用手机浏览

文章目录 [+]

http://www.pp3.cn/icon/size/16_16/2011/1128/831.html

试试以下小程序:

phpimgsrc正则表达式技巧_python|若何理解及精确构建一个关于图片链接的正则表达式 phpimgsrc正则表达式技巧_python|若何理解及精确构建一个关于图片链接的正则表达式 PHP教程

import reimport urllib.requestimport os #1 抓取网页(网页上有图片地址)url = 'http://www.pp3.cn/icon/size/qita/2011/1128/758.html'req = urllib.request.urlopen(url)buf = req.read()req.close() #2 获取图片地址# 下面4句截取url的前半截,如http://www.pp3.cn(一些图片是相对地址)i = url.find("/",9) url0 = urlif i > 0 : url0 = url[:i] buf = buf.decode('gb2312') # 有些网页编码是utf-8,要同等listurl = re.findall(r'img src=.[^\'\"]+\.png',buf)for i in range(len(listurl)): # 把字符img src="去掉 listurl[i]=listurl[i].replace('img src="',"") if not re.match("http",listurl[i]): # 如果是相对地址,加上上面提取的基地址 listurl[i]=url0 + listurl[i] print(listurl[i]) # 将图片地址列表打印一下 #3 抓取图片并保存到本地fpath = "D:\\pic2\\"if not os.path.isdir(fpath): os.mkdir(fpath)i = 0for url in listurl: f=open(fpath + str(i)+'.png','wb') req = urllib.request.urlopen(url) buf = req.read() f.write(buf) f.close() i+=1

有四个关键点:

phpimgsrc正则表达式技巧_python|若何理解及精确构建一个关于图片链接的正则表达式 phpimgsrc正则表达式技巧_python|若何理解及精确构建一个关于图片链接的正则表达式 PHP教程
(图片来自网络侵删)

1 网页的编码:有的是GB2312,有的是utf-8。

2 有的网站做事器做了反爬虫设置,须要写较繁芜的代码来绕过。

3 图片网址正则表达式的设置。
如上述的

r'img src=.[^\'\"]+\.png'

图片的HTML的写法:

img src='http//…/picPath/…/.png'img src='http//…/picPath/…/.jpg'img src="http//…/picPath/…/.jpg"img src="picPath/…/.jpg"

要通过适当的正则表达式来构建上述字符串表示规律。

3.1 圆点“.”表示除'\n'以外的任意字符。
上述可以表示单引号或双引号,如果没有其它字符,如在引用前还有一个字符,可多写一个圆点.。

3.2 “[^\'\"]+”表示一串除了单引号或双引号以外的任意数量的其它字符。
直到碰着“\.png”为止(可能涌现贪婪匹配)。
“[]”表示列举,“^”表示非,打消后面紧跟的字符;“\”表示转义,转义是指转变原来的含义,单引号和双引号原来是用来界定字符的,用转义符来放弃这个用场,用做普通字符。
加号“+”表示一个或多个前面的字符表示。

3.3 "\.png"表示圆点.和图片的类型png。

上面说到贪婪匹配,要设置为非贪婪匹配,用小括号分组加一个问号即可:

reg = r'img src=.([^\'\"]+\.png)?'

如果涌现问题,可以相看原网页的图片地址编写格式及规律,大略化处理。

如图片地址都有如下规律,

http://www.pp3.cn/uploads/allimg/111128/1-11112…….png

可将正则表达式大略写为:

http://www.pp3.cn/uploads/allimg/111128/1-11112\S.png

“/S”表示任意数量非空缺字符。

如果有多个网页,可以将上述代码写成函数形式,循环调用:

import re # 正则表达式import urllib.request # 从做事器要求返回资源import os # 文件和目录操作import socket # 套接字操作#socket.setdefaulttimeout(20) # 设置socket层的超时时间为20秒def gethtml(url): #1 抓取网页html内容 with urllib.request.urlopen(url) as req: buf = req.read() return bufdef getImg(buf,codec,fpath,rege): #2 从html筛选图片地址到list# 下面4句截取url的前半截,如http://www.pp3.cn(一些图片是相对地址) i = url.find("/",9) url0 = url if i > 0 : url0 = url[:i] buf = buf.decode(codec) listurl = re.findall(reg,buf) #reg是正则表达式 print("准备下载图片数量:",len(listurl)) for i in range(len(listurl)): #listurl[i]=listurl[i].replace('img src="',"") # 把字符img src="去掉 if not re.match("http",listurl[i]): listurl[i]=url0 + listurl[i] print(listurl[i]) #3 抓取图片并保存到本地 if not os.path.isdir(fpath): os.mkdir(fpath) i = 0 ''' for imgurl in listurl: urllib.request.urlretrieve(imgurl,fpath + str(i)+'.jpg') i+=1 '''#下面的操作办法要快一点 for imgurl in listurl: f=open(fpath + str(i)+'.jpg','wb') # 新建空缺图片文件 req = urllib.request.urlopen(imgurl) # 获取网页图片文件 buf = req.read() # 读取网站上图片文件内容 f.write(buf) # 将网站上图片内容写入新建的图片文件 f.close() i+=1# 四处内容须要确认:1 网页url; 2 网页编码UTF-8或gb2312;# 3 图片扩展名jpg或png(两处); 4 保存的文件夹codec = 'gb2312'reg = r'img src=.([^\'\"]+\.png)?'webpages = ['http://www.pp3.cn/icon/size/qita/2011/1128/758.html', # 需提取图片的网址可写到列表内 'http://www.pp3.cn/icon/size/32_32/2011/1128/768.html' ]i = 0for url in webpages: buf = gethtml(url) fpath = "D:\\" + str(i) +"\\" print(getImg(buf,codec,fpath,reg)) # 函数循环调用 i+=1 url = 'http://culture.ifeng.com/c/7vm9bFrvQpl'codec = 'utf-8'buf = gethtml(url)reg = r'img src=..([^\'\"]+\.jpeg)?'fpath = 'D:\\A\\'print(getImg(buf,codec,fpath,reg)) # 函数单独调用

图片格式不同的较灵巧的写法:

import reimport urllib.requestimport osfrom itertools import islice # 跳过可迭代工具的开始部分# fpath = "D:\\pic2\\"# 剖析网页文本、提到图片超链接到list,逐一将list项保存到图片文件# ① 要把稳网页的字符编码,可在网页查看# ② 要把稳网站图片的url格式规律# ③ 要把稳图片的扩展名# ④ 一次总是抓取不堪利,缘故原由是第三张无法打开,后跳过#"""# 1 获取网页文本url = 'http://www.pp3.cn/icon/size/16_16/2011/1128/831.html'#url = 'http://www.pp3.cn/icon/size/16_16/2011/1128/835.html'# 1.1 url没加header的写法req = urllib.request.urlopen(url)buf = req.read()req.close()# 1.2 在urllib中添加headers不同的写法,须要headers是字典或元组"""headers = { # 如有反爬,可添加网页自己的header 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', }req = urllib.request.Request(url=url,headers=headers)file = urllib.request.urlopen(req)buf = file.read()"""#2 多网页文本中解析出图片地址i = url.find("/",9) # 本句及下面三句截取url的前半截url2 = urlif i > 0 : url2 = url[:i]#buf = buf.decode('UTF-8')buf = buf.decode('gb2312')#picType = '.jpg'#picType = '.jpeg'picType = '.png'#picType = '.gif'#listurl = re.findall(r'http:.[^"]+\.jpg',buf)if picType == '.jpg' : listurl = re.findall(r'img src=.([^\"^\']+\.jpg)?',buf)if picType == '.jpeg' : listurl = re.findall(r'img src=.([^\"^\']+\.jpeg)?',buf)if picType == '.png' : listurl = re.findall(r'img src=.([^\"^\']+\.png)?',buf)if picType == '.gif' : listurl = re.findall(r'img src=.([^\"^\']+\.gif)?',buf)for i in range(len(listurl)): # 把字符img src="去掉 listurl[i]=listurl[i].replace('img src="',"") if not re.match("http",listurl[i]): listurl[i]=url2 + listurl[i] print(listurl[i])#""" """# 已知图片url,只是序号不同listurl = []strs = "http://www.graphiscnn.com/evahbcms/upload/image/196/00"for x in range(2,55): listurl.insert(x,strs+str(x)+".jpg")""" #3 抓取图片并保存到本地i = 1fpath = "D:\\pic3\\"if not os.path.isdir(fpath): os.mkdir(fpath)#for url in listurl: # 列表的第三张无法打开,导致失落败for url in islice(listurl, 4, None): f=open(fpath + str(i)+picType,'wb') req = urllib.request.urlopen(url) buf = req.read() f.write(buf) print(i,picType) f.close() i+=1"""# UnicodeEncodeError: 'UCS-2' codec can't encode characters# in position 73-73: Non-BMP character not supported in Tk# 爬取的HTML页面中包含了Unicode下无法识别的字符,添加标识为①-③的三行代码import requestsimport sys # ①non_bmp_map = dict.fromkeys(range(0x10000,sys.maxunicode + 1),0xfffd) # ②url = 'https://p.51vv.com/vp/kws2X4IT'html = requests.get(url,headers=headers)print(html.request.headers)html = str(html.text).translate(non_bmp_map) # ③print(html)"""

运行:

提取到的图片:

End

标签:

相关文章

DG设计师网站,探索时尚创意的数字平台

随着互联网的飞速发展,各行各业都在积极拥抱数字化,时尚行业也不例外。DG设计师网站作为我国时尚界的重要平台,不仅为广大设计师提供了...

PHP教程 2024-12-05 阅读0 评论0

C适用程序,技术详细与适用价值的完美融合

随着计算机技术的不断发展,编程语言在各个领域得到了广泛应用。C语言作为一种历史悠久且应用广泛的编程语言,因其强大的性能和广泛的适用...

PHP教程 2024-12-05 阅读0 评论0