実現したいこと
高専機構(国立高等専門学校機構)の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 開けない エラー」と検索したが、見つけられなかった。
補足
特になし
pdf_links = re.findall(r'href=[\'"]?([^\'" >]+)', response.text)
そもそもですが、対象の PDF ファイルの URL にスペースが入っていますので、上記の正規表現では URL の途中までしか抽出できず、結果として、
if link.endswith('.pdf'):
で False となるためダウンロードされるファイルは一つもない、という結果になっています。そちらの環境では当該の PDF ファイルをダウンロードできていますでしょうか?
> # HTMLからPDFファイルのリンクを抽出し、ダウンロード
上記リンクはちゃんと抽出できているか確認されましたか?
melian さん
「そちらの環境では当該の PDF ファイルをダウンロードできていますでしょうか?」
レスありがとうございます。
はい。
>発生している問題・分からないこと
>コードを実行して、目的のファイルをすべてダウンロードできた。
と、記載の通り、ダウンロードできております。
meg_さん
コメントありがとうございます。
「上記リンクはちゃんと抽出できているか確認されましたか?」について存じておらず、調べましたがよく理解できませんでした。もっと言うと、お問い合わせの趣旨も理解できておりません。
リンク抽出できているとは、どういう意味なのか、参考サイト等があれば教えていただけますでしょうか?
例えば、以下の様な 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 はダウンロードされていません。
meg_さん
コメントありがとうございます。
「URLにスペースが入っているため、正規表現の問題で、対象のPDFがダウンロードできないのではないか?」というご指摘だと理解しましたが、合っていますでしょうか?
当方の環境では、当該URLにおいてダウンロード可能なPDFの全75ファイルは、すべて、ローカル環境にダウンロードできております。
但し、それらをAdobe Readerで開こうとすると、エラーが出て開けない
という状態です。
> 当方の環境では、当該URLにおいてダウンロード可能なPDFの全75ファイルは、すべて、ローカル環境にダウンロードできております。
質問のコードを実行したところでは、pdf_linksの中に「.pdf」で終わる文字列はありませんでした。
その75ファイルはどこかに移動して質問のコードを再度実行して確認いただけないでしょうか?
できたファイルのサイズはゼロではないのでしょうか?
ゼロでない場合は、エディタ等で中身を確認してみることをお勧めします。(なんらかのエラー表示がダウンロードされているのは、よくあるケースです → status_code のチェックをしましょう)
そのコードではダウンロードできません。
bsdfan さん
ダウンロードできた75個のファイルのファイルサイズは、すべて同じで、175KBでした。
ダウンロードしたファイルを、アドバイスのとおりエディタで開いてみたところ、中身はhtmlファイルでした。
このため、拡張子を、PDFからHTMLに変更して、ファイルを確認したところ、他のファイルも、同じ内容のHTMLとなっておりました(すべてを確認したわけではありません)。
meg_さん
コメントありがとうございます。
一度ダウンロードできたファイルを削除して、再度、質問のコードを実行したところ、75個のファイルがダウンロードできました。
但し、当方でダウンロードできたと思っていたPDFは、既述の通り、拡張子がPDFというだけで、中身はHTMLファイルでした
> 一度ダウンロードできたファイルを削除して、再度、質問のコードを実行したところ、75個のファイルがダウンロードできました。
同じコードを実行して結果が異なるというのは不思議な現象ですね。質問者さんの状況が当方で確認できないため残念ながらこれ以上検証できないです。

回答1件
あなたの回答
tips
プレビュー