我试图通过以下网站获取世界人口:https://www.worldometers.info/world-population/ 但是我只能获取html代码,而不能获取实际数字的数据。
我已经尝试找到我试图从中获取数据的对象的子代。我还尝试列出整个对象,但似乎没有任何效果。
'''只是导入内容'''
import urllib.request
import requests
from bs4 import BeautifulSoup
'''从网站获取HTML到文本'''
r = requests.get('https://www.worldometers.info/world-population/')
soup = BeautifulSoup(r.text,'html.parser')
''''',此处只能找到'''
下列出的一个对象current_population = soup.find('div',{'class':'maincounter-number'}).find_all('span', recursive=False)
print(current_population)
这是信息存储在的对象:
(span class="rts-counter" rel="current_population">retrieving data... </span>
在“检查模式”下,您可以看到以下内容:
(span class="rts-counter" rel="current_population">(span class="rts-nr-sign"></span>(span class="rts-nr-int rts-nr-10e9">7</span>(span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e6">703</span>(span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e3">227</span><span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e0">630</span></span>
我总是只获得第一个,但想从“检查模式”中获得第二个。
Here是检查模式的图片。
答案 0 :(得分:1)
您要抓取的网站是一个JavaScript网络应用。在检查模式下看到的元素内容是在填充该元素的页面下载后运行一些JavaScript代码的结果。在运行JavaScript之前,该元素仅包含文本“正在检索数据...”,这是您在Python代码中看到的内容。 Python请求库和BeautifulSoup都不在下载的HTML中运行JavaScript -它们仅下载并解析HTML,这就是为什么您的代码只能看到初始文本的原因。
您有两个选择:
答案 1 :(得分:1)
您将需要一种方法,该方法可通过以下脚本中生成的计数器来设置此数字,从而使javascript运行诸如硒之类的硒:https://www.realtimestatistics.net/rts/RTSp.js
from selenium import webdriver
d = webdriver.Chrome()
d.get('https://www.worldometers.info/world-population/')
print(d.find_element_by_css_selector('[rel="current_population"]').text)
您可以尝试编写自己的JavaScript脚本版本,但我不建议这样做。
我不需要硒脚本的explicit wait条件,但是可以添加。
答案 2 :(得分:0)
Javascript是在DOM上呈现的,因此Beautiful Soup将无法正常使用。
您必须制作一些可以运行javascript的程序(例如,浏览器),以便可以使用QT4等来制作自己的浏览器。 Sentdex在此处提供了很好的教程:
https://www.youtube.com/watch?v=FSH77vnOGqU
否则,您可以使用Selenium:
from selenium import webdriver
import time
drive = webdriver.Firefox()
drive.get('https://www.worldometers.info/world-population/')
time.sleep(5)
html = driver.page_source