【发布时间】:2020-07-21 20:49:26
【问题描述】:
有谁知道为什么这段代码不起作用?当我想用某个日期的数据(例如仅从 2017 年开始但不是这个日期)刮取较小的文件时,它可以完美地工作。这个文件是不是太大了?没有错误或类似的东西。每次我运行这个脚本但提到的文件较小时,下载所有内容并保存到数据库大约需要 30 秒,所以我认为代码中没有错误。运行脚本后,我只是得到“进程完成,退出代码 0”,仅此而已。
from bs4 import BeautifulSoup
import urllib.request
from app import db
from models import CveData
from sqlalchemy.exc import IntegrityError
url = "https://cve.mitre.org/data/downloads/allitems.xml"
r = urllib.request.urlopen(url)
xml = BeautifulSoup(r, 'xml')
vuln = xml.findAll('Vulnerability')
for element in vuln:
note = element.findAll('Notes')
title = element.find('CVE').text
for element in note:
desc = element.find(Type="Description").text
test_date = element.find(Title="Published")
if test_date is None:
pass
else:
date = test_date.text
data = CveData(title,date,desc)
try:
db.session.add(data)
db.session.commit()
print("adding... " + title)
# don't stop the stream, ignore the duplicates
except IntegrityError:
db.session.rollback()
【问题讨论】:
-
使用调试器,单步调试代码,看看出了什么问题。
-
如果不调试我的代码,我绝不会在这里提问。我仍然找不到任何解决方案,这就是我在这里的原因。即使我很欣赏你的回应,我认为这毫无意义。
-
嘿@Vicaris2code,接下来人们会问的很多问题都是您在调试时可能已经发现的。比如,在你的代码路径中,它在哪里转错了?例如,代码是否会进入您的 try 语句?
-
你的意思是它在这里失败了:
r = urllib.request.urlopen(url),失败是指代码在该行之后不再执行?就像如果你在它后面加上一个 print 语句,它就不会到达那里? -
老兄,这是一个 171MB 的 XML 文件。您可能需要设置一些超时并确保您有足够的内存来吃它。也许首先尝试获取并保存本地以确保您能够成功下载。然后测试您是否可以使用 BeautifulSoup 读取/解析该本地文件。
标签: python xml beautifulsoup