如何用BeautifulSoup结合正则提取非标准data-link属性的RPM包链接
解决方法
你的代码存在几个问题:
- 缺少
requests模块的导入,调用requests.get()会直接报错。 - 正则表达式转义错误,且没必要用正向预查,直接匹配属性值即可。
- 虽然BeautifulSoup支持用正则匹配属性值,但你的正则写法有误。
修正后的代码方案一(正则匹配属性值)
#!/usr/bin/env python3 import re import requests # 补上缺失的导入 from bs4 import BeautifulSoup url = "https://www.splunk.com/en_us/download/splunk-enterprise.html" page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') # 修正正则:直接匹配以.rpm结尾的链接值 pattern = re.compile(r".*\.rpm$") # 筛选带data-link属性且值匹配正则的a标签 packages = soup.find_all("a", attrs={"data-link": pattern}) # 提取并打印所有RPM包链接 for pkg in packages: print(pkg["data-link"])
方案二(lambda表达式筛选)
如果觉得正则写起来麻烦,用lambda表达式直接判断属性值结尾更直观:
#!/usr/bin/env python3 import requests from bs4 import BeautifulSoup url = "https://www.splunk.com/en_us/download/splunk-enterprise.html" page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') # 筛选存在data-link属性且值以.rpm结尾的a标签 packages = soup.find_all("a", attrs={"data-link": lambda x: x and x.endswith(".rpm")}) for pkg in packages: print(pkg["data-link"])
关键说明
- 必须导入
requests模块才能发起HTTP请求获取页面内容。 - BeautifulSoup的
find_all()支持通过正则或可调用对象(如lambda)匹配属性值,逻辑正确即可筛选到目标元素。 - 直接提取标签的
data-link属性值就能得到RPM包链接,无需额外从HTML文本中匹配。
内容的提问来源于stack exchange,提问作者VenomCA
相关产品推荐
相关产品推荐

