Python 当试图从网页上的图像中提取元数据时,总是返回{},为什么?
我看过Exifrad文档,它说它是作为字典返回的,但问题是它只返回{},我不知道这是否意味着图像中没有元数据,或者我错了,反正我花了很多时间查看我的代码和文档,但仍然无法找到解决方案,请提供任何帮助:) 代码:Python 当试图从网页上的图像中提取元数据时,总是返回{},为什么?,python,beautifulsoup,metadata,Python,Beautifulsoup,Metadata,我看过Exifrad文档,它说它是作为字典返回的,但问题是它只返回{},我不知道这是否意味着图像中没有元数据,或者我错了,反正我花了很多时间查看我的代码和文档,但仍然无法找到解决方案,请提供任何帮助:) 代码: 问题是您没有传递基本url,您需要传递主机,然后将其连接到src,除非您从src属性获得绝对url 下面的代码演示了一个工作示例,我用它代替了urllib,但逻辑是相同的: import bs4 import sys import os import requests from urlp
问题是您没有传递基本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?我已经尝试过,老实说,我可能会尝试修改代码,所以我只是从我的机器上的图像中读取元数据,而不是从网站中提取图像,以查看问题是否可能来自网站的图像,而不是我的代码,但现在我有点不知所措。我的意思是运行你的代码,你在上面列出的三个网站上测试了它。