我需要从三种类型的直接和间接URL中提取文件扩展名。
“https://needmode.com/products/350e0f54c3480dc035d6db5e7ef898711d5f4ebc_1683455668.jpg”
“https://dkstatics-public.digikala.com/digikala-products/350e0f54c3480dc035d6db5e7ef898711d5f4ebc_1683455668.jpg?x-oss-process=image/resize,m_lfit,h_800,w_800/quality,q_90”
“https://meghdadit.com/_image.ashx?i=%252ffiles%252fproduct%252f4778c8kbqjb7k18sqydnkztp4yzi0jlaug5j5jtybsmuw0lzq2%255blarge%255d.jpg”
我的目标是在所有此类 URL 中返回“jpg”作为文件扩展名。
我的Python代码:
from urllib.parse import urlparse
import os
img = "IMAGE URL"
parsed_url = urlparse(img)
filename_and_extension = parsed_url.path.rsplit("/", maxsplit=1)[-1]
file_extension = parsed_url.path.rsplit(".", maxsplit=1)[-1].lower()
print("first method: "+file_extension)
filename, file_extension = os.path.splitext(img)
print("second method: "+file_extension)
第一种方法不适用于第三个 URL,第二种方法不适用于第二个 URL。
有没有办法优先考虑第一种方法,从 URL 右侧选择扩展名?
如果您有有效扩展名的列表,则搜索这些扩展名可能比尝试解析整个 URL 更容易。维基百科似乎有一个非常非常广泛的已知扩展列表:
https://en.wikipedia.org/wiki/List_of_filename_extensions
如果您随后使用维基百科中的上述表格来生成您自己的有效扩展名列表,您可以采用几种不同的方法,因为您会在某种程度上知道所有可能的答案。我是正则表达式的粉丝,因为这样的东西(假设你有一长串潜在的扩展),但并不是每个解决方案都一定需要需要正则表达式。假设您有一个
.txt
文件,其中包含您要在不同行上查找的所有扩展名
import re
extList = open("path/to/.txt").readlines()
# Just to make sure no whitespace is included --> Could also use str.strip()
extList = [re.sub(r"\s","",ext) for ext in extList]
# Pipe (|) represents OR in regex. (?i) Enables IGNORE_CASE
regString = "|".join(extList)
# Use list of Ext's, preceded by '.', to find potential matches
regExtensions = re.compile(rf"(?i)\.(?:{regString})") # "(?i)\.(?:PNG|JPG|DOC.....)"
这将与上面提到的扩展相匹配。此处显示的示例:https://regex101.com/r/drTCEY/1
然后您可以从给定字符串
url
中提取扩展名:
ext = regExtensions.findall(url)[0]
但是,可以改进此正则表达式以排除错误信息,但这取决于 URL 的一致性。在提供的示例中,扩展名后面似乎是字符串末尾或“?”,这可以添加到正则表达式中,如下所示:
regExtensions = re.compile(rf"(?i)\.(?:{regString})(?=$|\n|\?)")
,但这又取决于您正在使用的 URL 模式。
最后,如果您想从匹配中排除
.
,请将该字符设置为后视字符,而不是作为匹配的一部分:
regExtensions = re.compile(rf"(?i)(?<=\.)(?:{regString})")