Веб-сканирование Javascript элементов с запросами и Beautifulsoup - PullRequest
0 голосов
/ 07 мая 2020

Я работаю над своим самым первым проектом Python, используя BeautifulSoup для веб-обработки данных из https://www.tva.com/Environment/Lake-Levels/South-Holston. Я понимаю основы работы с веб-браузером и слежу за обучающими материалами YouTube. Однако я столкнулся с проблемами при попытке извлечь данные из указанного выше URL.

   from bs4 import BeautifulSoup
   import requests

   URL = requests.get('https://www.tva.com/Environment/Lake-Levels/South-Holston')
   soup = BeautifulSoup(URL,'lxml')

   main_body = soup.body.div
   print(main_body.prettify())   

Я использую приведенный выше код basi c для синтаксического анализа страницы на предмет основной части веб-сайта. Распечатав проанализированный контент и сравнив его с исходным кодом в Google Chrome, я заметил, что некоторые элементы отсутствуют. Данные, которые я пытаюсь проанализировать (генераторы в разделе Generation Releases), находятся в таблице, вложенной в класс HTML <div class="tvawidget".... При сравнении проанализированных данных с исходным кодом выясняется, что данные в таблице и сама таблица обмениваются с function display(data). Надеюсь, все это не слишком запутанно, дайте мне знать, если мне нужно уточнить.

Исходный код данных, которые я пытаюсь извлечь

1 Ответ

0 голосов
/ 07 мая 2020

Правильно, элемент заполняется Javascript. Но вы можете смоделировать запрос Ajax с помощью модуля requests, например:

import re
import requests

url = 'https://www.tva.com/Environment/Lake-Levels/South-Holston'
rest_api_url = 'https://www.tva.com/RestApi/generation-releases/{lake_name}?format=json'

html_data = requests.get(url).text
lake_name = re.search(r"lakeName\s*=\s*'(.*)'", html_data).group(1)

data = requests.get(rest_api_url.format(lake_name=lake_name)).json()

# pretty print to screen:    
from pprint import pprint
pprint(data)

Печать:

[{'Day': '05/06/2020', 'Generators': '1', 'Time': '1 AM - Midnight EDT'},
 {'Day': '05/07/2020', 'Generators': '1', 'Time': 'Midnight - Midnight EDT'},
 {'Day': '05/08/2020', 'Generators': '1', 'Time': 'Midnight - 1 AM EDT'}]

EDIT:

Скриншот с URL от Firefox Инструменты разработчика:

enter image description here

...