Мне часто нужен список CVE, перечисленных на странице бюллетеня по безопасности поставщика. Иногда это просто скопировать, но часто они смешиваются с кучей текста.
Я давно не трогал Python, поэтому я подумал, что это было бы отличным упражнением для определения как извлечь эту информацию - тем более что я продолжаю делать это вручную.
Вот мой текущий код:
#!/usr/bin/env python3
# REQUIREMENTS
# python3
# BeautifulSoup (pip3 install beautifulsoup)
# python 3 certificates (Applications/Python 3.x/ Install Certificates.command) <-- this one took me forever to figure out!
import sys
if sys.version_info[0] < 3:
raise Exception("Use Python 3: python3 " + sys.argv[0])
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
#specify/get the url to scrape
#url ='https://chromereleases.googleblog.com/2020/02/stable-channel-update-for-desktop.html'
#url = 'https://source.android.com/security/bulletin/2020-02-01.html'
url = input("What is the URL? ") or 'https://chromereleases.googleblog.com/2020/02/stable-channel-update-for-desktop.html'
print("Checking URL: " + url)
# CVE regular expression
cve_pattern = 'CVE-\d{4}-\d{4,7}'
# query the website and return the html
page = urlopen(url).read()
# parse the html returned using beautiful soup
soup = BeautifulSoup(page, 'html.parser')
count = 0
############################################################
# ANDROID === search for CVE references within <td> tags ===
# find all <td> tags
all_tds = soup.find_all("td")
#print all_tds
for td in all_tds:
if "cve" in td.text.lower():
print(td.text)
############################################################
# CHROME === search for CVE reference within <span> tags ===
# find all <span> tags
all_spans = soup.find_all("span")
for span in all_spans:
# this code returns results in triplicate
for i in re.finditer(cve_pattern, span.text):
count += 1
print(count, i.group())
# this code works, but only returns the first match
# match = re.search(cve_pattern,span.text)
# if match:
# print(match.group(0))
То, что у меня работает для URL Android, работает нормально; у меня проблема с Chrome URL. Они содержат информацию CVE внутри тегов <span>
, и я пытаюсь использовать регулярные выражения, чтобы вытащить это.
Используя подход re.finditer
, я получаю результаты в трех экземплярах. Используя подход re.search
, он пропускает CVE-2019-19925 - они перечислили два CVE на одной и той же строке.
Можете ли вы дать какой-нибудь совет о том, как лучше всего это работает?