为什么我能';你不能用Python刮取那个大的XML文件吗?
有人知道为什么这个代码不起作用吗?当我想使用某个日期的数据(例如仅从2017年开始,但不使用此日期)刮取较小的文件时,它可以完美地工作。这个文件太大还是怎么的?没有错误或类似的事情。每次我运行这个脚本,但是使用上面提到的较小的文件,下载所有内容并保存到数据库大约需要30秒,所以我认为代码中没有错误。运行脚本后,我只得到“进程结束,退出代码为0”之类的信息为什么我能';你不能用Python刮取那个大的XML文件吗?,python,xml,beautifulsoup,Python,Xml,Beautifulsoup,有人知道为什么这个代码不起作用吗?当我想使用某个日期的数据(例如仅从2017年开始,但不使用此日期)刮取较小的文件时,它可以完美地工作。这个文件太大还是怎么的?没有错误或类似的事情。每次我运行这个脚本,但是使用上面提到的较小的文件,下载所有内容并保存到数据库大约需要30秒,所以我认为代码中没有错误。运行脚本后,我只得到“进程结束,退出代码为0”之类的信息 from bs4 import BeautifulSoup import urllib.request from app import db
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()
我下载了你说不起作用的文件,你说的那个文件起作用了,我运行了这两个greps,结果不同:
grep -c "</Vulnerability>" allitems-cvrf-year-2019.xml
21386
grep -c "</Vulnerability>" allitems.xml
0
grep-c“allitems-cvrf-year-2019.xml
21386
grep-c“allitems.xml
0
程序在打开文件时没有停止,而是一直运行到完成。您没有得到任何输出,因为xml文件中没有
漏洞
标记。(现在我的grep在技术上并不准确,因为我相信漏洞关闭标签中可能有空格,但我怀疑这里的情况是这样的。)使用调试器,逐步检查代码,看看出了什么问题。如果不调试我的代码,我决不会在这里问任何问题。我仍然找不到任何解决办法这就是我来这里的原因。即使我很欣赏你的回答,我认为这是毫无意义的。嘿@Vicaris2code,人们接下来会问的很多问题都是你在调试时可能已经发现的。比如,在你的代码路径中,哪里发生了错误的转向?例如,代码是否曾经进入您的try语句中?您的意思是它在这里失败:r=urllib.request.urlopen(url)
,而失败是指代码在该行之后不再执行?比如说,如果你在它后面放了一个打印语句,它就不会出现了?伙计,那是一个171MB的XML文件。你可能需要设置一些超时,并确保你有足够的内存来吃它。也许首先只是尝试获取并保存本地文件,以确保您能够成功下载。然后测试您是否可以使用BeautifulSoup读取/解析该本地文件。恐怕您是对的。非常感谢你的帮助。我一定错过了什么。