Очистка веб-страниц на загруженных в Dinamica JS сайтах

#python #selenium #web-scraping #beautifulsoup

#python #селен #очистка веб-страниц #beautifulsoup

Вопрос:

Я выполняю веб-очистку следующей страницы: COVID, что мне нужно сделать, это сгенерировать csv-файл таблицы, которая отображается на странице, но динамически загружается данными, для которых я использую selenium. Проблема в том, что даже в этом случае я не могу найти таблицы со следующим кодом:

 import requests 
from bs4 import BeautifulSoup 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
import time 
  
#url of the page we want to scrape 
url = "https://saluddigital.ssch.gob.mx/covid/"
  
# initiating the webdriver. Parameter includes the path of the webdriver. 
driver = webdriver.Firefox()  
driver.get(url)  
  
# this is just to ensure that the page is loaded 
html = driver.page_source 

soup = BeautifulSoup(html, "html.parser")

print(len(soup.find_all("table")))
driver.close()
driver.quit()
 

Когда я печатаю таблицу, я получаю 0, поскольку он не может ее найти.

Ответ №1:

Я также пытаюсь извлечь и сгенерировать csv-файл с данными. Надеется, что это поможет.

 import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import csv
url = "https://saluddigital.ssch.gob.mx/covid/"

# initiating the webdriver. Parameter includes the path of the webdriver.
driver = webdriver.Chrome()
driver.get(url)
time.sleep(5) # delay for load properly
# # this is just to ensure that the page is loaded
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

table = soup.select_one('div.contenedor-general')

header = [[a.getText(strip=True,separator=' ')][0].split() for a in table.find_all('tr', {'class': 'header-table'})]
text1 = [t.text.strip().split() for t in soup.find_all('tr', {'class': 'ringlon-1'})]
text2 = [t.text.strip().split() for t in soup.find_all('tr', {'class': 'ringlon-2'})]


with open('outz.csv', 'w') as f:
    wr = csv.writer(f, delimiter=',')
    wr.writerow(header[0][1:])
    for row in text1:
        wr.writerow(row)
    for row in text2:
        wr.writerow(row)
 

Ответ №2:

Похоже, вам нужно выполнить простой GET https://saluddigital.ssch.gob.mx/app/asincronos/jsonstats.ashx?getconteos=1 и проанализировать ответ JSON.