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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

726閲覧

requestsとBeautifulSoupをインポートするとprintの出力結果がブラウザに表示されない

suika11

総合スコア166

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/18 08:39

編集2022/01/19 06:07

前提・実現したいこと

requestsとBeautifulSoupをインポートするとprintの結果がブラウザに表示されず真っ白です。requestsとBeautifulSoupの二つをコメントアウトすると表示されます。二つのモジュールをコメントアウトした時のようにprintの結果をブラウザの画面上に表示したいです。

該当のソースコード

index.py

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4import cgi # CGIモジュールのインポート 5import cgitb 6import sys 7import requests 8from bs4 import BeautifulSoup 9 10cgitb.enable() # デバッグに使うので、本番環境では記述しない 11 12form = cgi.FieldStorage() # フォームデータを取得する 13 14print("Content-Type: text/html; charset=UTF-8") # HTMLを記述するためのヘッダ 15print("") 16 17# フォームのデータが入力されていない場合 18if "url" not in form: 19 print("<h1>Error!</h1>") 20 print("<br>") 21 print("テキストを入力してください!") 22 print("<a href='/'><button type='submit'>戻る</button></a>") 23 sys.exit() 24 25url = form.getvalue("url") # データの値を取得する 26 27r = requests.get(url) 28r.encoding = r.apparent_encoding # 呪文 29soup = BeautifulSoup(r.text, 'html.parser') 30title = soup.find("meta", property="og:title") 31description = soup.find("meta", property="og:description") 32image = soup.find("meta", property="og:image") 33print(title['content']) 34print(description['content']) 35print(image['content'])

cgiserver.py

1import http.server 2http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)

index.html

1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta charset="utf-8"> 6 <title>Test Page</title> 7 <style> 8 h1 { 9 text-align: center; 10 } 11 12 .container { 13 width: 300px; 14 margin: 0 auto; 15 text-align: center; 16 } 17 18 input { 19 width: 300px; 20 padding: 10px 20px; 21 margin-bottom: 10px; 22 } 23 24 button { 25 padding: 5px 30px; 26 border-radius: 5px; 27 } 28 </style> 29</head> 30 31<body> 32 <h1>URLを探す</h1> 33 <div class="container"> 34 <form action="cgi-bin/index.py" method="post"> 35 <input type="text" name="url" placeholder="url"> 36 <button>探す</button> 37 </form> 38 </div> 39</body> 40 41</html>

試したこと

pip showコマンドで当該モジュールのインストールの確認

補足情報(FW/ツールのバージョンなど)

Python 3.10.1

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

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

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

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

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

CHERRY

2022/01/18 11:21

> requestsとBeautifulSoupをインポートするとprintの結果がブラウザに表示されず真っ白です。 CGI で、実行した際に画面が真っ白になるのは、 Pythonスクリプトを実行した際にエラーが発生していると考えられます。 Webサーバーのログには、どのようなエラーメッセージが記録されているでしょうか。 ( Import 文をコメントにすると実行できるということなので、 ImportError の可能性が高いと思いますが... )
suika11

2022/01/18 12:04 編集

172.17.0.1 - - [18/Jan/2022 08:18:54] CGI script exit code 1 172.17.0.1 - - [18/Jan/2022 08:18:58] "POST /cgi-bin/index.py HTTP/1.1" 200 - Traceback (most recent call last): File "/app/cgi-bin/index.py", line 8, in <module> from bs4 import BeautifulSoup ModuleNotFoundError: No module named 'bs4' 172.17.0.1 - - [18/Jan/2022 08:18:59] CGI script exit code 1 172.17.0.1 - - [18/Jan/2022 08:19:01] "POST /cgi-bin/index.py HTTP/1.1" 200 - 172.17.0.1 - - [18/Jan/2022 08:27:41] "POST /cgi-bin/index.py HTTP/1.1" 200 - Traceback (most recent call last): File "/app/cgi-bin/index.py", line 7, in <module> import requests ModuleNotFoundError: No module named 'requests' このようなエラーがありました 追記 上記の二つのモジュールを確認すると、bs4のみインストールされてないためインストールしました。しかしrequestsはインストール済みなのにエラー表示されます。
otn

2022/01/18 12:03

bs4とrequestsをインストールしましょう。
suika11

2022/01/18 12:05

otnさん コメントありがとうございます。上でも書きましたがbs4はインストールしましたが、requestsはすでにインストールされているのにエラー表示されました
CHERRY

2022/01/18 12:29 編集

すでにインストール済みで ModuleNotFoundError が出るのであれば、複数の Python がインストールされていないでしょうか。 pip でインストールした Python と別の Python で動かしていませんか? CGI で使用している方の Pythonにインストールしてみてください。
suika11

2022/01/18 12:49

使用しているPythonにインストールされているかどうかはどのように確認するのでしょうか?
guest

回答2

0

自己解決

cgiserver.py

1import http.server 2http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)

上記ファイルをpython3コマンドで実行したら解決しました。ローカルサーバーの立上げをしていなかったためrequestsやBeautifuleSoupがimportできなかったようです

投稿2022/01/18 20:52

編集2022/01/18 21:06
suika11

総合スコア166

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

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

0

上でも書きましたがbs4はインストールしましたが、requestsはすでにインストールされている

使わないPythonにインストールしても無意味です。

使用しているPythonにインストールされているかどうかはどのように確認するのでしょうか?

エラーになっているので、確認するまでもなくインストールされていません。

#!/usr/bin/env python3

のようなどのPythonが実行されるか明示しない書き方をしているからこんなこと(自分がどのPythonを使っているかわからない)になります。

#!の後に実行したいPython(モジュールインストール済みのPython)のフルパスを明示しましょう。

投稿2022/01/18 13:17

otn

総合スコア84380

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

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

suika11

2022/01/18 15:54 編集

#!の後にpythonのフルパスに変更しましたが画面は空白のままでした。変更した後のログでは「FileNotFoundError: [Errno 2] No such file or directory: '/app/cgi-bin/index.py'」と表示されました 追記 #!/usr/bin/env python3 のようなどのPythonが実行されるか明示しない書き方をしているからこんなこと(自分がどのPythonを使っているかわからない)になります。 試しにターミナルで先頭に#!/usr/bin/env python3が書かれたindex.pyを実行すると問題はありませんでした。ブラウザとターミナルとで何が違うのでしょうか
otn

2022/01/18 16:13 編集

> #!の後にpythonのフルパスに変更しましたが画面は空白のままでした。変更した後のログでは > 「FileNotFoundError: [Errno 2] No such file or directory: '/app/cgi-bin/index.py'」と表示されました エラーメッセージが不審です。 #!/app/cgi-bin/index.py と書いていれば、そういうエラーメッセージにならないはず。何と書いたのでしょう? で、index.py は python じゃないです。 #!の後に書くのはpythonのフルパスです。type python で表示されるかと思います。 > ブラウザとターミナルとで何が違うのでしょうか 実行されるPythonが違う理由は環境変数PATHが違うからです。 環境変数PATHの意味の理解は必須です。
suika11

2022/01/18 16:10 編集

python3を使っているため、type python3で出てきたパスを#!以降に配置し実行すると、「Exception occurred during processing of request from ('172.17.0.1', 55956) Traceback (most recent call last): File "/usr/local/lib/python3.10/http/server.py", line 1174, in run_cgi os.execve(scriptfile, args, env) FileNotFoundError: [Errno 2] No such file or directory: '/app/cgi-bin/index.py'」とログがありました
otn

2022/01/18 16:16

type python3の結果は何で、1行目には何と書いたのでしょうか?
suika11

2022/01/18 16:19

python3 is hashed (/Library/Frameworks/Python.framework/Versions/3.10/bin/python3)が結果で一行目は「#!/Library/Frameworks/Python.framework/Versions/3.10/bin/python3」としました
otn

2022/01/18 16:39

合ってそうですね。 /app/cgi-bin/index.py というのは何ですかね?存在しないファイルのようですが、どこから紛れ込んだのか?
suika11

2022/01/18 21:07 編集

>/app/cgi-bin/index.py というのは何ですかね?存在しないファイルのようですが、どこから紛れ込んだのか? すいません、本来補足情報等に記載すべきだったのですが、https://gray-code.com/blog/python-on-docker/ を参考にDocker上でPythonを動かしていまして、おそらくローカルと連動しているコンテナ内のパスだと思います この件なんとか事故解決できました。色々ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問