Мне нужно найти способ заставить мой код дать время для загрузки страницы, и только потом захватить HTML-код - PullRequest
1 голос
/ 03 июля 2019

Поэтому я хотел получить значение в реальном времени с веб-сайта, отображающего «революцию населения Земли в реальном времени» , за исключением случаев, когда я запускаю код:

import requests
import urllib.request
from bs4 import BeautifulSoup

url = 'https://www.theworldcounts.com/counters/shocking_environmental_facts_and_statistics/world_population_clock_live'

response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')

population = soup.findAll('p', attrs={'class':'counter'})

print(population[0])

myвывод:

<p class="counter" id="counters_number_interveal_5">loading...</p>

Номер, который я ищу, заменяется на " loading ... ", поэтому я ищу способ на самом деле получить значение.Или альтернатива, чтобы получить тот же результат.

Ответы [ 3 ]

1 голос
/ 03 июля 2019

Вы можете дождаться загрузки страницы явно, используя time.sleep(), что, вероятно, даст желаемый конечный результат. Тем не менее, это не лучшая практика и может в конечном итоге ждать дольше, чем страница, необходимая для загрузки.

Я бы рекомендовал вместо этого использовать Selenium, который имеет множество полезных функций, связанных с этим; конкретно это может неявно ждать.

Ниже описано, как вы можете использовать Selenium для ожидания загрузки счетчика и больше не ждать.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

url = 'https://www.theworldcounts.com/counters/shocking_environmental_facts_and_statistics/world_population_clock_live'
driver = webdriver.Firefox()
driver.get(url)

try:
    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "//*[@id=\"counters_number_interval_5\"]")))
    counter = driver.find_element_by_xpath("//*[@id=\"counters_number_interval_5\"]").text
    print(counter)
except TimeoutException:
    print("Timed out, couldn't load the page in time")

Вам нужно будет установить Selenium, но это все равно что установить BeautifulSoup - просто используйте pip install selenium

0 голосов
/ 04 июля 2019

Это потому, что вы нацелены не на тот класс. Вы можете найти желаемый результат во втором классе с тем же именем counter. Попробуйте любой из двух - один закомментирован, а другой активен. Они оба дают желаемый результат.

import requests
from bs4 import BeautifulSoup

url = 'https://www.theworldcounts.com/counters/shocking_environmental_facts_and_statistics/world_population_clock_live'

response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
population = soup.find(class_='item-content').find(class_='counter').text
# population = soup.select_one('.item-content > p.counter').text
print(population)
0 голосов
/ 03 июля 2019

Сайт все еще загружается, возможно, используйте модуль времени, чтобы скрипт ожидал ответа.

import time
time.sleep(5)
#Wait 5 seconds for the answer

Это должно быть добавлено между запросами.get и синтаксическим анализом с BeautifulSoup.

РЕДАКТИРОВАТЬ

Перечитывая ваш вопрос, проблема на самом деле заключается в использовании запросов, так как он загружает html немедленно, вам нужно добавить аргумент timeout для правильной загрузкиHTML:

response = requests.get(url, timeout = 5)
...