zch*_*zch 2 python png image file
我正在尝试搜索网页的源代码,并使用Python从中下载各种文件.此脚本在源代码中搜索.jpg文件,并按预期下载所有文件.但是,在修改脚本(将".jpg"更改为".png",如下所示)时,我收到错误:
Traceback (most recent call last):
File "img.py", line 19, in <module> urllib.urlretrieve(images[z], "image"+str(z)+".png")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 91, in urlretrieve
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 237, in retrieve
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 205, in open
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 461, in open_file
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 475, in open_local_file
IOError: [Errno 2] No such file or directory: '/images/adapt-icon-search.png?1342791397'
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的脚本:
import urllib
import urllib2
import re
print "enter url of site (such as 'dribbble.com')"
url = raw_input()
fullurl = "http://"+url
src = urllib2.urlopen(fullurl)
src = src.read()
images = re.findall('src="(.*\.png[^"]*)', src)
z=0
while z < len(images):
urllib.urlretrieve(images[z], "image"+str(z)+".png")
print "done"
z+=1
Run Code Online (Sandbox Code Playgroud)
关于为什么这个脚本不适用于.png文件的洞察将非常感激.提前谢谢了.
更新:以下是我想要搜索的源代码示例:
<span rel="tipsy" title="This shot has rebounds." class="rebound-mark has-rebounds">1</span>
</a>
</div>
</div>
<h2>
<a href="/Dash" class="url" rel="contact" title="Dash"><img alt="Avatar-new" class="photo fn" src="http://dribbble.s3.amazonaws.com/users/107759/avatars/original/avatar-new.png?1339961321" /> Dash</a>
<a href="/account/pro" class="badge-link">
<span class="badge badge-pro">Pro</span>
</a>
</h2>
Run Code Online (Sandbox Code Playgroud)
所以你得到的错误是这样的:
IOError:[Errno 2]没有这样的文件或目录:'/ images/adapt-icon-search.png?1342791397'
发生的事情是您正在抓取的网页有一些不包含URL中包含的域名的PNG引用.当您尝试在while循环中获取它们时,它会失败,因为您只提供远程主机上的位置:/images/adapt-icon-search.png?1342791397.
您需要扩展代码以检测这些类型的URL(这些URL非常合法,实际上非常常见).对于你在这里遇到的那种,你只需要在匹配的URL前面加上服务器的主机名(例如http://dribble.com/).
您可能还希望处理相对URL,这些URL也会排除主机名,但是不带/字符.如果有的话,那些将需要在前一页的路径前面加上.因此,如果您正在抓取http://dribble.com/foo/bar.html,则需要在其前面添加相对URL http://dribble.com/foo/.
可能有一个库可以自动处理非绝对URL,可能是网络抓取过程的一部分.我担心我对第一手网络抓取不太了解,但也许其他人可以在评论中提出建议.