#python #asp.net #web #web-scraping #beautifulsoup
#python #asp.net #веб #очистка веб-страниц #beautifulsoup
Вопрос:
Я работаю над очисткой данных о почве из https://websoilsurvey.sc.egov.usda.gov/App/WebSoilSurvey.aspx Я создал следующие параметры, чтобы выбрать интересующую область, запустить отчет, и у меня осталась таблица данных о почве на странице с несколькими таблицами. Я не знаком с очисткой таблиц, и я никогда раньше не писал на сайте .ASPX.
Вся онлайн-документация по синтаксическому анализу с помощью Beautiful Soup требует получения URL-адреса, в котором находится таблица. Мой URL на .Сайт ASPX не меняется при вводе параметров, поэтому я не могу использовать указанный выше URL-адрес (он остается этим URL-адресом все время). Тогда на сайте есть несколько таблиц, поэтому мне нужно будет классифицировать, какую из них мне нужно очистить.
Есть идеи о том, как разобрать эту таблицу?
import selenium
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import xlrd
import os
from openpyxl import load_workbook
import win32com.client as win32
import openpyxl as xl
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup as bs
# Downloading File #
# Using Chrome to access web
driver = webdriver.Chrome()
delay = 5
# Open the website
driver.get('https://websoilsurvey.sc.egov.usda.gov/App/WebSoilSurvey.aspx')
# Soil Survey Area
while True:
try:
driver.find_element_by_xpath('//*[@id="Quick_Navigation_Soil_Survey_Area_header"]/span/span').click()
break
except:
continue
states = ['ND', 'SD', 'MN']
for state in states:
# Select State
select = Select(driver.find_element_by_id('ssa_select_state'))
select.select_by_value(state)
while True:
try:
myElem = WebDriverWait(driver, delay).until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="navigateBySSAGrid"]/div[2]/div[1]/div[3]'), state))
break
except:
continue
select = driver.find_element_by_id('ssa_county_select')
selectall = Select(driver.find_element_by_id('ssa_county_select'))
counties = [x for x in select.find_elements_by_tag_name('option')]
for county in counties[1:]:
# Print for checks
print('Total Counties for ' state ': ' str(len(counties[1:])))
# Select County
selectall.select_by_value(county.get_attribute('value'))
myElem = WebDriverWait(driver, delay).until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="navigateBySSAGrid"]/div[2]/div[1]/div[3]'), county.get_attribute('value')))
# Click first county bubble
time.sleep(3)
driver.execute_script("arguments[0].click();", bubble)
# Set AOI
time.sleep(1)
driver.find_element_by_xpath('//*[@id="navigatebyssaformid"]/div[3]/button[1]').click()
# Click Soil Data Explorer tab
time.sleep(4)
driver.find_element_by_xpath('//*[@id="Soil_Data_Explorer"]').click()
# Expand Vegetative Productivity
myElem = WebDriverWait(driver, delay).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="Vegetative_Productivity_unfold"]')))
driver.find_element_by_xpath('//*[@id="Vegetative_Productivity_unfold"]').click()
# Expand Crop Productivity Index
time.sleep(3)
driver.find_element_by_xpath('//*[@id="Vegetative_Productivity_Crop_Productivity_Index_header"]/span/span').click()
# View Rating
myElem = WebDriverWait(driver, delay).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="ParameterForm190ViewRating_bottom"]')))
driver.find_element_by_xpath('//*[@id="ParameterForm190ViewRating_bottom"]').click()
# Parse table
break
Комментарии:
1. На стороне клиента вы создаете экземпляр браузера. Затем вручную введите значения, а затем, после того как страница отобразит правильные данные, вы сохраните эту страницу. В .net мы склонны избегать параметров, поскольку они ужасны, и мы пишем красиво vb.net или C # на основе элементов управления на этой странице, и когда вы нажмете «просмотр», тогда снова серверный код, написанный на c # / vb.net, будет выполняться и отображаться на основе этих управляющих значений. Довольно сложно для кода на стороне клиента нажимать правильные кнопки, вводить значения, а затем разрешать отображение страницы. Ваше клиентское программное обеспечение создает экземпляр браузера, затем вы вводите его вручную, а затем сохраняете страницу
2. Как только страница отображается с нужными данными, любой код может извлекать использовать этот DOM из этого экземпляра браузера. В то время как asp.net будет использовать серверный код (c #, vb.net ), конечная результирующая страница — это просто страница браузера. Итак, вам очень нужен работающий экземпляр браузера — просматривайте, нажимайте, переходите к тому, что вы хотите на этой странице, а затем программа хостинга в этот момент может сохранить / проанализировать эту веб-страницу. Большинство страниц aspx не управляются параметрами, поэтому у вас нет URL-адреса для ввода или использования, чтобы перейти к конечной желаемой странице с нужными данными.