【发布时间】: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