Python 当试图从网页上的图像中提取元数据时,总是返回{},为什么?

Python 当试图从网页上的图像中提取元数据时,总是返回{},为什么?,python,beautifulsoup,metadata,Python,Beautifulsoup,Metadata,我看过Exifrad文档,它说它是作为字典返回的,但问题是它只返回{},我不知道这是否意味着图像中没有元数据,或者我错了,反正我花了很多时间查看我的代码和文档,但仍然无法找到解决方案,请提供任何帮助:) 代码: 问题是您没有传递基本url,您需要传递主机,然后将其连接到src,除非您从src属性获得绝对url 下面的代码演示了一个工作示例,我用它代替了urllib,但逻辑是相同的: import bs4 import sys import os import requests from urlp

我看过Exifrad文档,它说它是作为字典返回的,但问题是它只返回{},我不知道这是否意味着图像中没有元数据,或者我错了,反正我花了很多时间查看我的代码和文档,但仍然无法找到解决方案,请提供任何帮助:)

代码:


问题是您没有传递基本url,您需要传递主机,然后将其连接到src,除非您从src属性获得绝对url

下面的代码演示了一个工作示例,我用它代替了urllib,但逻辑是相同的:

import bs4
import sys
import os
import requests
from urlparse import urljoin

def get_images(target, base):
    page = requests.get(target).content
    soup = bs4.BeautifulSoup(page, "html.parser")
    for img in soup.find_all("img", src=True):
        src = img.get("src")
        name = os.path.basename(src)
        if not src.startswith(("www.","http:","https:")):
                src = urljoin(base, src)
        with open(name, "wb+") as f:
            f.write(requests.get(src).content)
            f.seek(0)
            tags = exifread.process_file(f,"rb")
            print (tags)


def main():

    target ="http://www.exiv2.org/sample.html"
    # need base to join to relative src 
    base = "http://www.exiv2.org/"
    get_images(target, base)


if __name__ == "__main__":
    main()
您将在页面上获得一个图像的exif数据,该图像包含:

PIL示例:

import bs4
import os
import requests
from urlparse import urljoin
import PIL.Image

def get_images(target, base):
    page = requests.get(target).content
    soup = bs4.BeautifulSoup(page, "html.parser")
    for img in soup.find_all("img"):
        src = img.get("src")
        name = os.path.basename(src)
        if not src.startswith(("www.","http:","https:")):
                src = urljoin(base, src)
        with open(name, "wb+") as f:
            f.write(requests.get(src).content)
            f.seek(0)
            try:
                img = PIL.Image.open(f)
                exif_data = img._getexif()
                print(exif_data)
            except AttributeError as e:
                print("No exif data for {}".format(name))
                os.remove(name)

os.remove(name)
将删除没有exif数据的文件,如果您不希望发生这种情况,请将其删除。

问题是您没有传递基本url,您需要传递主机,然后将其连接到src,除非您从src属性获得绝对url

下面的代码演示了一个工作示例,我用它代替了urllib,但逻辑是相同的:

import bs4
import sys
import os
import requests
from urlparse import urljoin

def get_images(target, base):
    page = requests.get(target).content
    soup = bs4.BeautifulSoup(page, "html.parser")
    for img in soup.find_all("img", src=True):
        src = img.get("src")
        name = os.path.basename(src)
        if not src.startswith(("www.","http:","https:")):
                src = urljoin(base, src)
        with open(name, "wb+") as f:
            f.write(requests.get(src).content)
            f.seek(0)
            tags = exifread.process_file(f,"rb")
            print (tags)


def main():

    target ="http://www.exiv2.org/sample.html"
    # need base to join to relative src 
    base = "http://www.exiv2.org/"
    get_images(target, base)


if __name__ == "__main__":
    main()
您将在页面上获得一个图像的exif数据,该图像包含:

PIL示例:

import bs4
import os
import requests
from urlparse import urljoin
import PIL.Image

def get_images(target, base):
    page = requests.get(target).content
    soup = bs4.BeautifulSoup(page, "html.parser")
    for img in soup.find_all("img"):
        src = img.get("src")
        name = os.path.basename(src)
        if not src.startswith(("www.","http:","https:")):
                src = urljoin(base, src)
        with open(name, "wb+") as f:
            f.write(requests.get(src).content)
            f.seek(0)
            try:
                img = PIL.Image.open(f)
                exif_data = img._getexif()
                print(exif_data)
            except AttributeError as e:
                print("No exif data for {}".format(name))
                os.remove(name)

os.remove(name)
将删除没有exif数据的文件,如果您不希望发生这种情况,请将其删除。

您输入了什么url?我已经尝试过,老实说,我可能会尝试修改代码,所以我只是从我的机器上的图像中读取元数据,而不是从网站中提取图像,看看问题是否来自网站的图片,而不是我的代码,但现在我有点不知所措。我想运行你的代码,你在上面列出的三个网站上测试了它。你输入了什么url?我已经尝试过,老实说,我可能会尝试修改代码,所以我只是从我的机器上的图像中读取元数据,而不是从网站中提取图像,以查看问题是否可能来自网站的图像,而不是我的代码,但现在我有点不知所措。我的意思是运行你的代码,你在上面列出的三个网站上测试了它。