爬取NVD漏洞库CVE-2022-1285链接返回None问题排查
问题原因
元素定位层级错误:目标页面中类名为col-md-2的<span>标签本身不携带href属性,可点击的CVE跳转链接是嵌套在该span标签内部的<a>子标签,直接在span元素上调用get('href')必然返回None。
修复方案
两种实现思路均可正常获取目标内容:
- 思路1:先匹配到类名为
col-md-2的span标签,再向下查找内部嵌套的a标签,从a标签上提取文本和链接属性 - 思路2:直接通过CSS选择器匹配span.col-md-2下的a标签,一步完成元素定位
可运行的完整代码如下:
import requests from bs4 import BeautifulSoup as bs target_url = 'https://nvd.nist.gov/vuln/full-listing/2022/6' # 补充常规请求头,避免被站点反爬策略拦截返回异常页面 request_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } resp = requests.get(target_url, headers=request_headers) soup = bs(resp.text, 'html.parser') # 遍历匹配到的CVE条目 for cve_item in soup.find_all('span', class_='col-md-2'): link_tag = cve_item.find('a') if not link_tag: continue cve_id = link_tag.text.strip() # 匹配到目标CVE后输出信息 if cve_id == 'CVE-2022-1285': cve_detail_path = link_tag.get('href') # 拼接得到完整绝对链接 cve_full_link = f"https://nvd.nist.gov{cve_detail_path}" print(f"CVE编号:{cve_id}") print(f"详情页相对路径:{cve_detail_path}") print(f"详情页完整链接:{cve_full_link}") break
运行结果
代码执行后正常输出如下内容:
CVE编号:CVE-2022-1285 详情页相对路径:/vuln/detail/CVE-2022-1285 详情页完整链接:https://nvd.nist.gov/vuln/detail/CVE-2022-1285
补充说明:如果请求时不携带User-Agent头,有概率被NVD的Web应用防火墙拦截,返回403状态码或者非预期的页面内容,导致元素匹配失败,爬取该站点时建议默认加上常规浏览器请求头。
内容的提问来源于stack exchange,提问作者vicky
相关产品推荐
相关产品推荐

