如何用Python的BeautifulSoup从网站下载特定的GIF图像(条件:phd*.gif)?

0 投票
3 回答
1258 浏览
提问于 2025-04-20 07:02

我有一段代码,可以从一个网页链接下载所有的图片。

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

def main(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)

    def _usage():
    print "usage: python dumpimages.py http://example.com [outpath]"

if __name__ == "__main__":
    url = sys.argv[-1]
    out_folder = "/test/"
    if not url.lower().startswith("http"):
        out_folder = sys.argv[-1]
        url = sys.argv[-2]
        if not url.lower().startswith("http"):
            _usage()
            sys.exit(-1) 
    main(url, out_folder)

我想修改这段代码,让它只下载名字是'phd210223.gif'(比如说)的图片,也就是说,只下载符合条件的图片:'phd*.gif'。

另外,我还想把这个过程放在一个循环里,这样在从一个网页获取到这些图片后,它会把页面的ID加1,然后去下载下一个页面的图片,比如:'http://www.example.com/phd.php?id=2'。

我该怎么做呢?

3 个回答

0

我个人比较喜欢使用Python自带的工具,所以我用的是html.parser。你需要的东西大概是这样的:

import re, urllib.request, html.parser
class LinksHTMLParser(parse.HTMLParser):
    def __init__(self, length):
            super().__init__()
            self.gifs = list()

    def handle_starttag(self, tag, attrs):
            if tag == "a":
                    for name, value in attrs:
                            if name == "href":
                                gifName = re.split("/", value)[-1]
                                if *gifNameCondition*:
                                    self.gifs.append(value)

    parser = LinksHTMLParser()
    parser.feed(urllib.request.urlopen("YOUR URL HERE").read().decode("utf-8"))
    for gif in parser.gifs:
        urllib.request.urlretrieve(*local path to download gif to*, gif)
1

正则表达式可以帮助解决这个问题!当在字符串或网址中找到匹配的模式时,会返回一个匹配对象;如果没有找到,就会返回None。

import re
reg = re.compile('phd.*\.gif$')
str1 = 'path/phd12342343.gif'
str2 = 'path/dhp12424353153.gif'
print re.search(reg,str1)
print re.search(reg,str2)
1

与其在循环中检查名字,不如直接使用 BeautifulSoup 自带的 正则表达式支持。你只需要把编译好的正则表达式作为 src 参数的值提供即可:

import re

from bs4 import BeautifulSoup as bs # note, you should use beautifulsoup4

for image in soup.find_all("img", src=re.compile('phd\d+\.gif$')):
    ...

phd\d+\.gif$ 这个正则表达式会查找以 phd 开头的文本,后面跟着一个或多个数字,再接一个点,最后以 gif 结尾。

需要注意的是,你正在使用一个过时且不再维护的 BeautifulSoup3,建议你换成 beautifulsoup4

pip install beautifulsoup4

撰写回答