f-string 干扰提取 URL
f-string interfering with extracting URLs
tl;f-string 博士弄乱了下面的脚本。尽管文件包含 URL 列表,但打印的列表是空的。我该如何解决这个问题并让 Python 打印出 URL?
所以我在下面有一个脚本。它下载 URL 列表,将其转换为列表,然后打印出来。现在,对于变量 link
,有一个 f 字符串。如果我在 f 字符串中只保留一个值(假设我删除了 fromdate
和 todate
,只保留 username
),它就可以正常工作。但是如果我在 f 字符串中放入多个值,脚本就会失败。
命令
script.py -u mrbeast
脚本
import argparse, re, requests
parser = argparse.ArgumentParser()
parser.add_argument('-u','--username', required=False)
parser.add_argument('-from','--fromdate', required=False)
parser.add_argument('-to','--todate', required=False)
args = vars(parser.parse_args())
username = args['username']
fromdate = args['fromdate']
todate = args['todate']
link = "https://web.archive.org/cdx/search/cdx?url=twitter.com/{}/status&matchType=prefix&from={}&to={}".format(username,fromdate,todate)
listy = []
m = requests.get(link).text
urls = re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', m)
for b, url in enumerate (urls):
listy.append(f"{b}: {url}")
print(listy)
输出
[]
您遇到这种情况不是因为 f-strings,而是因为 python 格式化您的 link 的方式。变量 link 中没有使用 f-string,只是字符串格式。
传递空值时,python 将 None 送入 url 而不是像预期的那样将它们留空。
这导致 URL 看起来像这样
https://web.archive.org/cdx/search/cdx?url=twitter.com/None/status&matchType=prefix&from=None&to=None
一种解决方案是使用 or 逻辑运算符告诉 python 如果值为 none,则将变量设置为空字符串。这可以在变量声明中完成。
一种可能的方法如下
username = args['username'] or '' # or logic operator converts variable to '' if None.
fromdate = args['fromdate'] or ''
todate = args['todate'] or ''
希望对您有所帮助,
欢迎来到 stack overflow。
tl;f-string 博士弄乱了下面的脚本。尽管文件包含 URL 列表,但打印的列表是空的。我该如何解决这个问题并让 Python 打印出 URL?
所以我在下面有一个脚本。它下载 URL 列表,将其转换为列表,然后打印出来。现在,对于变量 link
,有一个 f 字符串。如果我在 f 字符串中只保留一个值(假设我删除了 fromdate
和 todate
,只保留 username
),它就可以正常工作。但是如果我在 f 字符串中放入多个值,脚本就会失败。
命令
script.py -u mrbeast
脚本
import argparse, re, requests
parser = argparse.ArgumentParser()
parser.add_argument('-u','--username', required=False)
parser.add_argument('-from','--fromdate', required=False)
parser.add_argument('-to','--todate', required=False)
args = vars(parser.parse_args())
username = args['username']
fromdate = args['fromdate']
todate = args['todate']
link = "https://web.archive.org/cdx/search/cdx?url=twitter.com/{}/status&matchType=prefix&from={}&to={}".format(username,fromdate,todate)
listy = []
m = requests.get(link).text
urls = re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', m)
for b, url in enumerate (urls):
listy.append(f"{b}: {url}")
print(listy)
输出
[]
您遇到这种情况不是因为 f-strings,而是因为 python 格式化您的 link 的方式。变量 link 中没有使用 f-string,只是字符串格式。 传递空值时,python 将 None 送入 url 而不是像预期的那样将它们留空。 这导致 URL 看起来像这样
https://web.archive.org/cdx/search/cdx?url=twitter.com/None/status&matchType=prefix&from=None&to=None
一种解决方案是使用 or 逻辑运算符告诉 python 如果值为 none,则将变量设置为空字符串。这可以在变量声明中完成。 一种可能的方法如下
username = args['username'] or '' # or logic operator converts variable to '' if None.
fromdate = args['fromdate'] or ''
todate = args['todate'] or ''
希望对您有所帮助, 欢迎来到 stack overflow。