如何使用python

时间:2016-11-24 18:39:52

标签: python html-parsing

我正在尝试创建一个擦除网页并下载找到的所有图像文件的脚本。

我的第一个函数是一个wget函数,它读取网页并将其分配给变量。 我的第二个功能是一个RegEx,用于搜索' ssrc ='在网页html中,下面是功能:

def find_image(text):
    '''Find .gif, .jpg and .bmp files'''
    documents = re.findall(r'\ssrc="([^"]+)"', text) 
    count = len(documents)
    print "[+] Total number of file's found: %s" % count
    return '\n'.join([str(x) for x in documents])

这样的输出是这样的:

example.jpg
image.gif
http://www.webpage.com/example/file01.bmp

我正在尝试使用urllib.urlretrieve(url,filename)编写第三个下载这些文件的函数,但我不知道如何解决这个问题,主要是因为某些输出是绝对路径,而其他路径是相对的。我也不确定如何同时下载所有内容并下载,而无需每次都指定名称和位置。

2 个答案:

答案 0 :(得分:0)

获取资源的路径不可知(可以处理绝对/相对路径) -

from bs4 import BeautifulSoup as bs
import urlparse
from urllib2 import urlopen
from urllib import urlretrieve
import os

def fetch_url(url, out_folder="test/"):
    """Downloads all the images at 'url' to /test/"""
    soup = bs(urlopen(url))
    parsed = list(urlparse.urlparse(url))

    for image in soup.findAll("img"):
        print "Image: %(src)s" % image
        filename = image["src"].split("/")[-1]
        parsed[2] = image["src"]
        outpath = os.path.join(out_folder, filename)
        if image["src"].lower().startswith("http"):
            urlretrieve(image["src"], outpath)
        else:
            urlretrieve(urlparse.urlunparse(parsed), outpath)

fetch_url('http://www.w3schools.com/html/')

答案 1 :(得分:0)

我无法给你写完整的代码,我确信这不是你想要的,但这里有一些提示:

1)用正则表达式解析随机HTML页面,有很多解析器。我建议BeautifulSoup。您将过滤所有img元素并获取其src值。

2)手头有src个值,您可以按照自己的方式下载文件。关于相对/绝对问题,请按this SO answer使用urlparse模块。我们的想法是将图像的src加入您下载HTML的网址。如果src已经是绝对的,它将保持这种状态。

3)至于全部下载,只需遍历要从中下载图像的网页列表,并为每个页面中的每个图像执行步骤1和2。当你说“同时”时,你可能意味着异步下载它们。在这种情况下,我建议下载每个网页in one thread