Сайт, который я пытаюсь почистить, таков:
http://www.imperial.courts.ca.gov/CourtCalendars/Public/MCalendars.aspx
Он использует ASPX для генерации ссылок на нужные мне PDF-файлы.
Старый код, который я пытался адаптировать, был:
import requests, sys, webbrowser, bs4, os
# v1 - this finds links but due to asp does not click through
print('Checking for Calendars')
res = requests.get('https://imperial.courts.ca.gov/CourtCalendars/Public/MCalendars.aspx')
res.raise_for_status
soup = bs4.BeautifulSoup(res.text, 'html.parser')
os.makedirs('Calendars', exist_ok=True)
for link in soup.findAll('a', href=True):
if link.string == 'Misdemeanor':
linkUrl = 'http:' + link.get('href')
res = requests.get(linkUrl) # this line is in error because aspx
#link in html d/n = link after click
res.raise_for_status()
pdfFile = open(os.path.join('Calendar', os.path.basename(linkUrl)), 'wb')
for chunk in res.iter_content(100000):
pdfFile.write(chunk)
pdfFile.close
Этот код работал на другом сайте, где адрес ссылки на первой странице = адрес ссылки, но здесь с динамическими ссылками ASPX это не так.
Я думал использовать KEYS, чтобы щелкнуть правой кнопкой мыши по каждой ссылке, затем открыть в новой вкладке, загрузить, но это кажется чрезмерным. (И я не уверен, как управлять несколькими вкладками в Selenium.)
Есть ли способ просто загрузить каждую ссылку в цикле if?
Другая альтернатива, которую я начал, была:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('https://imperial.courts.ca.gov/CourtCalendars/Public/MCalendars.aspx')
# using singular find_element, then click
# this gets one of the links, but not all
# per git, need to use find elements and loop through
#beneath gets 0 new tabs
linkElems = browser.find_elements_by_link_text('Misdemeanor')
totalLinks = len(linkElems)
for i in linkElems:
i.send_keys(Keys.CONTROL + 't')
Но, в принципе, я не уверен, как щелкнуть и загрузить (или открыть, загрузить, закрыть) каждый из них.
Заранее спасибо.