Использование Beautiful Soup или Selenium (Py) для загрузки ссылок ASPX PDF - PullRequest
0 голосов
/ 19 марта 2019

Сайт, который я пытаюсь почистить, таков: 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')

Но, в принципе, я не уверен, как щелкнуть и загрузить (или открыть, загрузить, закрыть) каждый из них.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Использовать параметры Chrome.

chromeOptions=webdriver.ChromeOptions()
prefs = {"plugins.always_open_pdf_externally": True}
chromeOptions.add_experimental_option("prefs",prefs)
driver = webdriver.Chrome(chrome_options=chromeOptions)
driver.get("https://imperial.courts.ca.gov/CourtCalendars/Public/MCalendars.aspx")

linkElems = driver.find_elements_by_link_text('Misdemeanor')

for i in linkElems:
    driver.get(i.get_attribute('href'))
1 голос
/ 19 марта 2019

Могу поспорить, что он ломается не из-за того, что является файлом ASPX, а потому, что это относительный путь. Это должно работать, если вы делаете это:

linkUrl = 'https://imperial.courts.ca.gov/CourtCalendars/Public/' + link.get('href')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...