Использование BeautifulSoup для загрузки PDF-файлов с веб-страницы - PullRequest
1 голос
/ 05 января 2020

Я написал функцию, чтобы найти все файлы .pdf на веб-странице и загрузить их. Это работает хорошо, когда ссылка общедоступна, но когда я использую ее для веб-сайта курса (доступ к которому можно получить только по адресу inte rnet моего университета), загруженные файлы PDF повреждены и не могут быть открыты.

Как это исправить?

def get_pdfs(my_url):
    html = urllib2.urlopen(my_url).read()
    html_page = BeautifulSoup(html)
    current_link = ''
    links = []
    for link in html_page.find_all('a'):
        current_link = link.get('href')
        if current_link.endswith('pdf'):
            links.append(my_url + current_link)
    print(links)

    for link in links:
        #urlretrieve(link)
        wget.download(link)

get_pdfs('https://grader.eecs.jacobs-university.de/courses/320241/2019_2/')

Когда я использую эту грейдерную ссылку, current_link похож на /courses/320241/2019_2/lectures/lecture_7_8.pdf, но часть /courses/320241/2019_2/ уже включена в my_url, и когда я добавляю ее, она, очевидно, не работает. Однако эта функция отлично работает для [этой ссылки] [1]:

Можно ли использовать одну и ту же функцию для работы с обоими типами ссылок?

1 Ответ

1 голос
/ 06 января 2020

ОК, думаю, теперь я понимаю проблему. Попробуйте код ниже на ваших данных. Я думаю это работает, но, очевидно, я не мог попробовать это прямо на странице, требующей входа в систему. Кроме того, я немного изменил вашу структуру и определения переменных, потому что мне проще так думать, но если это сработает, вы можете легко изменить его по своему вкусу.

В любом случае, вот так:

import requests
from bs4 import BeautifulSoup as bs
from urllib.parse import urlparse

my_urls = ['https://cnds.jacobs-university.de/courses/os-2019/', 'https://grader.eecs.jacobs-university.de/courses/320241/2019_2']
links = []
for url in my_urls:    
    resp = requests.get(url)
    soup = bs(resp.text,'lxml')
    og = soup.find("meta",  property="og:url")
    base = urlparse(url)
    for link in soup.find_all('a'):
        current_link = link.get('href')
        if current_link.endswith('pdf'):
            if og:
                links.append(og["content"] + current_link)
            else:
                links.append(base.scheme+"://"+base.netloc + current_link)
for link in links:
    print(link)
...