以下代码从 URL 获取版本号,然后对于每个版本号,转到该版本号的页面并使用文件名的特定模式填充数组。生成的数组应包含每个版本号的文件名列表,但它似乎只包含早期版本 (2.6)。使用 print 语句,我可以看到代码的工作原理是它获取 sha256sums.asc 文件 - 所有这些文件,所有版本。我猜我还不了解有关填充 Python 数组的一些知识,并且我的代码不允许 patch_full_versions 数组按预期包含从版本 2.6 到 6.9 的所有内容。
如果数组以某种方式被重置,我希望它只包含最新版本号,但事实恰恰相反 - 它只包含最早的版本号。就好像它只是停在那里,即使代码继续为更高版本获取信息。
`
patches_versions = []
patches_full_versions = []
RT_PATCHES_BASE_URL = "https://cdn.kernel.org/pub/linux/kernel/projects/rt/"
cleaner = re.compile("<.*?>") # For removing HTML tags later.
# Create array of patches versions:
patches_page_content = requests.get(RT_PATCHES_BASE_URL)
patches_page_content.raise_for_status()
stripped_content = re.sub(cleaner, "", patches_page_content.text)
for line in stripped_content.splitlines():
x = False
x = re.findall(r"[0-9]", line)
if not line == "":
if x:
patches_versions.append(line.split("/")[0])
patch_name_pattern = re.compile(r'patch-.*?\.tar\.xz')
for x in patches_versions:
patch_version_page_content = requests.get(f"{RT_PATCHES_BASE_URL}{x}/sha256sums.asc")
patch_version_page_content.raise_for_status()
for match in re.findall(patch_name_pattern, patch_version_page_content.text):
patches_full_versions.append(match)
`
的代码存在一些问题,导致它无法按预期工作。主要问题是没有清除
patches_full_versions
列表。这意味着,对于每个循环迭代,都在
添加
到现有的列表中,而不是创建一个新的列表。
以下是对的代码的一些改进和解释:
import requests
import re
patches_versions = []
patches_full_versions = []
RT_PATCHES_BASE_URL = "https://cdn.kernel.org/pub/linux/kernel/projects/rt/"
cleaner = re.compile(r"<.*?>")
patch_name_pattern = re.compile(r'patch-.*?\.tar\.xz')
# 获取版本号列表
patches_page_content = requests.get(RT_PATCHES_BASE_URL)
patches_page_content.raise_for_status()
stripped_content = re.sub(cleaner, "", patches_page_content.text)
for line in stripped_content.splitlines():
# 使用startswith方法简化版本号提取
if line.startswith("5."):
patches_versions.append(line.split("/")[0])
# 对于每个版本,获取补丁文件名列表
for version in patches_versions:
patches_full_versions = [] # 为每个版本创建一个新的列表
patch_version_page_content = requests.get(f"{RT_PATCHES_BASE_URL}{version}/sha256sums.asc")
patch_version_page_content.raise_for_status()
for line in patch_version_page_content.text.splitlines():
match = patch_name_pattern.search(line)
if match:
patches_full_versions.append(match.group(0))
print(f"Version: {version}, Patches: {patches_full_versions}") # 打印每个版本的补丁列表
代码解释:
-
patches_full_versions = []
在循环内: 在每个版本的循环迭代开始时,我们创建了一个新的patches_full_versions
列表。这可以确保我们不会将新版本的数据添加到先前版本的数据中。 -
使用
startswith
方法: 使用startswith
方法来检查以"5."开头的行,这是一种更简洁、更可读的方式来识别版本号行。 -
直接使用
re.search
获取匹配项: 使用re.search
方法在每行中查找匹配的补丁文件名,如果找到匹配项,则使用match.group(0)
获取完整的匹配字符串。 - 打印每个版本的补丁列表: 在每个版本的循环迭代结束时,我们打印了该版本的补丁文件名列表。
通过这些更改,代码现在应该可以按预期工作,为提供每个可用版本的补丁文件名列表。
标签:python,arrays,regex,response From: 78776639