Python 即使(div=";pendingcasescnts ng scope";)元素存在,BeautifulSoup也返回None

Python 即使(div=";pendingcasescnts ng scope";)元素存在,BeautifulSoup也返回None,python,html,python-3.x,web-scraping,beautifulsoup,Python,Html,Python 3.x,Web Scraping,Beautifulsoup,我正在尝试从站点中的“Div”多类中刮取文本: 它无法找到div元素 from bs4 import BeautifulSoup from requests import get url ="https://icsid.worldbank.org/en/Pages/cases/ConcludedCases.aspx?status=c" response = get(url) html_soup = BeautifulSoup(response.text, 'html.parser') case

我正在尝试从站点中的“Div”多类中刮取文本:

它无法找到
div
元素

from bs4 import BeautifulSoup
from requests import get
url ="https://icsid.worldbank.org/en/Pages/cases/ConcludedCases.aspx?status=c"
response = get(url)
html_soup = BeautifulSoup(response.text, 'html.parser')
cases_containers = html_soup.find_all('div', class_ ="pendingcasescnts ng-scope")
print(len(cases_containers))

您可以观察到,页面通过一个单独的请求来请求屏幕上的所有信息,该请求以JSON格式返回您需要的所有数据,而不是删除HTML。可以使用
.json()
请求函数将其转换为Python字典

下面显示了返回的JSON如何用于提取
案例号
主题
扇区
字段:

from urllib3.exceptions import InsecureRequestWarning
import requests

requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
r = requests.get('https://wbwcfe.worldbank.org/icsidext/service.svc/getbulkcasesbystatusid/json?id=cd28', verify=False)
data = r.json()

for case in data['GetBulkCasesByStatusIdResult']:
    print(f"Case No.: {case['caseno']}\nSubject: {case['subject']}\nSector: {case['econsector']}\n")    
为您提供如下输出案例:

案件编号:CONC/18/1
主题:水服务和电力特许权
行业:电力和其他能源
案件编号:ARB/17/40
主题:油气特许权
行业:石油、天然气和采矿
案件编号:ARB/17/39
主题:油气特许权
行业:石油、天然气和采矿
在加载问题中给出的URL时,使用浏览器的网络工具找到URL


我建议您打印出
数据
并研究所有可用字段。

ng scope
表示角度,这是一个JavaScript库。该div是否存在于HTML本身中,或者是在浏览器中创建的?@Chris的可能副本我认为“div”存在于HTML本身中,您可以通过检查网站来验证:我通常不会离开网站去理解您的问题(下次,请包括所有相关数据,以便您的问题是独立的),但是我可以告诉您,页面的服务器响应不包含带有
ng scope
属性的
。它必须通过JavaScript创建,在这种情况下,您应该查看我上面给出的建议副本。(通过禁用JavaScript,然后尝试加载页面,自己尝试一下。)Chris是对的,你需要
selenium
谢谢你,Martin,我对selenium也有同样的结果,但你的解决方案更为优化