【问题标题】:Can't find children past a certain point using BeautifulSoup使用 BeautifulSoup 找不到超过某个点的孩子
【发布时间】:2020-07-04 02:33:03
【问题描述】:

我目前正在尝试解析以下网页上的不同配置:

https://nvd.nist.gov/vuln/detail/CVE-2020-3661

具体来说,我正在“div”标签中查找 ID 与“config-div-\d+”匹配的数据

我已尝试运行以下命令:

parsed = BeautifulSoup(requests.get('https://nvd.nist.gov/vuln/detail/CVE-2020-3661').content, 'html5lib')
configs = parsed.findAll('div', {'id' : re.compile('config-div-\d+')})

但是,配置总是会产生 None。我已经尝试了 BeautifulSoup 文档页面上列出的所有解析器,它们都产生了相同的结果。

所以我尝试只找到父节点 (div id="vulnCpeTree") 并通过手动从主体向下钻取来确保我拥有正确的节点。

parent = parsed.find('div', {'id' : 'vulnCpeTree'})
parent.findChildren()
[]

所有解析器可以解析的深度是否有限制?有没有办法改变这个/解决这个问题?还是我错过了什么?

感谢您的帮助!

【问题讨论】:

  • 你可以使用 json 提要,而不是网络抓取,可以在这里找到,nvd.nist.gov/vuln/data-feeds#JSON_FEED
  • 这个网页看起来像是使用 JS 将结果加载到表格中。这就是为什么您没有得到任何结果的原因,因为 BS4 不会等待 JS 完成加载。它只是从 URL 中检索 HTML 文件。如果您在浏览器中“查看页面源代码”,您会看到这些 div id 也不存在。话虽如此,看起来数据在<pre> 标签内,所以find_all'pre' 上。或者,您可以使用 selenium 进行抓取,因为它会等待 JS 完成加载,或者按照 @Sushanth 的建议使用 JSON 提要。

标签: python web-scraping beautifulsoup


【解决方案1】:

@Sushanth 和@Scratch'N'Purr 都为这个问题提供了很好的答案。 @Sushanth 提供了您在尝试了解漏洞时应该使用的方法,@Scratch'N'Purr 解释了为什么我遇到了原始问题中的问题如果我真的想走网络抓取这条路。

谢谢你们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多