【问题标题】:Why I can't scrape that large XML file using Python?为什么我不能使用 Python 抓取那个大的 XML 文件?
【发布时间】: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


【解决方案1】:

我下载了你说不起作用的文件,而你说的那个做了,并运行了这两个 grep,结果不同:

grep -c "</Vulnerability>" allitems-cvrf-year-2019.xml
21386

grep -c "</Vulnerability>" allitems.xml
0

程序在打开文件时没有停止,它正在运行完成。您没有得到任何输出,因为 xml 文件中没有 Vulnerability 标记。 (现在我的 grep 在技术上并不准确,因为我相信 Vulnerability 结束标记中可能有空格,但我怀疑这里的情况。)

【讨论】:

  • 恐怕你是对的。非常感谢您的帮助。我一定错过了什么。
猜你喜欢
  • 2014-09-08
  • 2021-08-06
  • 2018-11-23
  • 2022-01-12
  • 1970-01-01
  • 2012-08-05
  • 2011-05-11
  • 2021-04-11
  • 2015-07-18
相关资源
最近更新 更多