質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

302閲覧

Pythonで、一括ダウンロードしたPDFが開けない

k2masuda

総合スコア1

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2024/02/22 01:48

実現したいこと

高専機構(国立高等専門学校機構)のWebサイトに、掲載されている入試過去問のPDFを、Pythonで一括でダウンロードしたい

発生している問題・分からないこと

コードを実行して、目的のファイルをすべてダウンロードできた。しかし、ダウンロードしたPDFを開いても正しく開けない。すべてのファイルが、同じ症状で開けない。

エラーメッセージ

error

1Adobe Readerでは、以下のエラーメッセージが表示 2・ファイルの種類がサポートされていないか、 3 または、ファイルが破損している可能性があります。 4・例えば、電子メールのっ添付文書として送信され、 5 正しくデコードされなかったことなどが考えられます。

該当のソースコード

Python

1import requests 2import os 3import re 4 5# ダウンロードするURL 6url = "https://www.kosen-k.go.jp/exam/admissions/kosen_navi.html" 7 8# ダウンロード先のパス 9download_path = "d:\\" 10 11# HTTP GETリクエストを送信し、HTMLを取得 12response = requests.get(url) 13 14# ファイルをダウンロードする関数 15def download_file(file_url, file_path): 16 try: 17 with open(file_path, 'wb') as f: 18 print("Downloading", file_url) 19 f.write(requests.get(file_url).content) 20 print("Download completed:", file_url) 21 except Exception as e: 22 print("Error downloading file:", file_url) 23 print("Error message:", str(e)) 24 25# HTMLからPDFファイルのリンクを抽出し、ダウンロード 26if response.status_code == 200: 27 # ダウンロード先のパスが存在しない場合は作成 28 os.makedirs(download_path, exist_ok=True) 29 30 # HTMLからPDFファイルのリンクを抽出 31 pdf_links = re.findall(r'href=[\'"]?([^\'" >]+)', response.text) 32 33 # PDFファイルをダウンロード 34 for link in pdf_links: 35 if link.endswith('.pdf'): 36 file_url = link 37 file_name = os.path.basename(file_url) 38 if "mondai.pdf" in file_name or "seikai.pdf" in file_name or "yousi.pdf" in file_name: 39 file_path = os.path.join(download_path, file_name) 40 download_file(file_url, file_path) 41else: 42 print("Failed to retrieve HTML content.")

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

「Python ダウンロード PDF 開けない エラー」と検索したが、見つけられなかった。

補足

特になし

tatsu99👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/02/22 03:31 編集

pdf_links = re.findall(r'href=[\'"]?([^\'" >]+)', response.text) そもそもですが、対象の PDF ファイルの URL にスペースが入っていますので、上記の正規表現では URL の途中までしか抽出できず、結果として、 if link.endswith('.pdf'): で False となるためダウンロードされるファイルは一つもない、という結果になっています。そちらの環境では当該の PDF ファイルをダウンロードできていますでしょうか?
meg_

2024/02/22 03:28

> # HTMLからPDFファイルのリンクを抽出し、ダウンロード 上記リンクはちゃんと抽出できているか確認されましたか?
k2masuda

2024/02/22 04:12

melian さん 「そちらの環境では当該の PDF ファイルをダウンロードできていますでしょうか?」 レスありがとうございます。 はい。 >発生している問題・分からないこと >コードを実行して、目的のファイルをすべてダウンロードできた。 と、記載の通り、ダウンロードできております。
k2masuda

2024/02/22 04:16

meg_さん コメントありがとうございます。 「上記リンクはちゃんと抽出できているか確認されましたか?」について存じておらず、調べましたがよく理解できませんでした。もっと言うと、お問い合わせの趣旨も理解できておりません。 リンク抽出できているとは、どういう意味なのか、参考サイト等があれば教えていただけますでしょうか?
melian

2024/02/22 04:23

例えば、以下の様な a 要素あって、".../upload-file folder/..." の箇所にスペースが入っています。 <a class="ml15" href="https://www.kosen-k.go.jp/Portals/0/upload-file folder/04_学務/admissions/2024/01_2024_kokugo_mondai.pdf" target="_blank">問題</a> これを件の正規表現でマッチさせると、以下の様になります。 >>> re.findall(r'href=[\'"]?([^\'" >]+)', '<a class="ml15" href="https://www.kosen-k.go.jp/Portals/0/upload-file folder/04_学務/admissions/2024/01_2024_kokugo_mondai.pdf" target="_blank">問題</a>') ['https://www.kosen-k.go.jp/Portals/0/upload-file'] "/upload-file" で途切れてしまっています。他の PDF ファイルの URL も "https://../upload-file folder/.." となっていますので、その正規表現では抽出できない状況というわけです。 こちらで試してみても、対象の PDF はダウンロードされていません。
k2masuda

2024/02/22 04:35

meg_さん コメントありがとうございます。 「URLにスペースが入っているため、正規表現の問題で、対象のPDFがダウンロードできないのではないか?」というご指摘だと理解しましたが、合っていますでしょうか? 当方の環境では、当該URLにおいてダウンロード可能なPDFの全75ファイルは、すべて、ローカル環境にダウンロードできております。 但し、それらをAdobe Readerで開こうとすると、エラーが出て開けない という状態です。
meg_

2024/02/22 04:58

> 当方の環境では、当該URLにおいてダウンロード可能なPDFの全75ファイルは、すべて、ローカル環境にダウンロードできております。 質問のコードを実行したところでは、pdf_linksの中に「.pdf」で終わる文字列はありませんでした。 その75ファイルはどこかに移動して質問のコードを再度実行して確認いただけないでしょうか?
bsdfan

2024/02/22 05:04

できたファイルのサイズはゼロではないのでしょうか? ゼロでない場合は、エディタ等で中身を確認してみることをお勧めします。(なんらかのエラー表示がダウンロードされているのは、よくあるケースです → status_code のチェックをしましょう)
can110

2024/02/22 07:03

そのコードではダウンロードできません。
k2masuda

2024/02/22 07:22

bsdfan さん ダウンロードできた75個のファイルのファイルサイズは、すべて同じで、175KBでした。 ダウンロードしたファイルを、アドバイスのとおりエディタで開いてみたところ、中身はhtmlファイルでした。 このため、拡張子を、PDFからHTMLに変更して、ファイルを確認したところ、他のファイルも、同じ内容のHTMLとなっておりました(すべてを確認したわけではありません)。
k2masuda

2024/02/22 07:33

meg_さん コメントありがとうございます。 一度ダウンロードできたファイルを削除して、再度、質問のコードを実行したところ、75個のファイルがダウンロードできました。 但し、当方でダウンロードできたと思っていたPDFは、既述の通り、拡張子がPDFというだけで、中身はHTMLファイルでした
meg_

2024/02/22 09:18

> 一度ダウンロードできたファイルを削除して、再度、質問のコードを実行したところ、75個のファイルがダウンロードできました。 同じコードを実行して結果が異なるというのは不思議な現象ですね。質問者さんの状況が当方で確認できないため残念ながらこれ以上検証できないです。
guest

回答1

0

ベストアンサー

Python 3.11.6/requests 2.31.0 で実行して、対象の PDF ファイルが全てダウンロードされて正常に閲覧できていることを確認しています。

python

1import requests 2import os 3import re 4import sys 5import traceback 6from pathlib import Path 7from urllib.request import urlretrieve 8import urllib.parse 9 10# ダウンロードするURL 11url = "https://www.kosen-k.go.jp/exam/admissions/kosen_navi.html" 12 13# ダウンロード先のパス 14download_path = "d:\\" 15 16# HTTP GETリクエストを送信し、HTMLを取得 17try: 18 response = requests.get(url) 19 response.raise_for_status() 20 response.encoding = response.apparent_encoding 21except requests.exceptions.RequestException as e: 22 print("Failed to retrieve HTML content.") 23 traceback.print_exception(type(e), e, e.__traceback__) 24 sys.exit(1) 25 26# ダウンロード先のパスが存在しない場合は作成 27os.makedirs(download_path, exist_ok=True) 28 29# HTMLからPDFファイルのリンクを抽出し、ダウンロード 30pdf_links = re.findall(r'href="(.+?\.pdf)"', response.text) 31for url in pdf_links: 32 file_name = Path(download_path).joinpath(Path(url).name) 33 url = urllib.parse.quote(url, safe='/:') 34 print("Downloading", url) 35 try: 36 urlretrieve(url, file_name) 37 print("Download completed:", url) 38 except Exception as e: 39 print("Error downloading file:", url) 40 traceback.print_exception(type(e), e, e.__traceback__)

投稿2024/02/22 04:34

melian

総合スコア19825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k2masuda

2024/02/22 07:19

回答ありがとうございます。 先ほど自席に戻り、試したところ、当方の環境でもダウンロードおよび閲覧が確認でき、問題が解決しました。 数行の修正でダウンロードできるようになると思っておりましたが、知らないライブラリが多数ありましたので、これから、コードを検証しながら精進したいと思います。 ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問