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

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

新規登録して質問してみよう
ただいま回答率
86.12%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

解決済

自分で作ったPythonのプログラムをJinjaで反映させたい

chario
chario

総合スコア2

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

1回答

0リアクション

0クリップ

267閲覧

投稿2021/07/23 13:11

編集2021/07/23 16:19

前提・実現したいこと

私は今学校でPythonを勉強してます。
元々Tkinterで作ったプログラムを発表したところWebアプリ化してみたら勉強になるといわれFlask(ローカルのみ)で実装しようとしています。
Jinja自体初めてで、Webサーバー等不慣れな点もたくさんあるため、アドバイスを頂ければと思っています。
あまり回りにPythonの事で相談できる人が少ないのでここで質問をさせてください。

実装したいプログラム

これらをJinjaで実装する場合、どういった書き方(?)等が理想なのでしょうか?
サーバーサイド側の知識があまりなく今まで書いたこともなかったので、どうしていいか混乱してしまっている状態です。
正直Tkinterで作っていたプログラムをJinjaにどうやって落とし込めばいいのか・・・。
大混乱中なため、どんなことでもアドバイスを頂ければ・・・!と思ってます。
宜しくお願い致します。

以下のソースは元々画像をスクレイピングで保存をする というプログラムの一部になります。
全文載せてしまうと長ったらしいので割愛させて頂きます。

python

###スクレイピング・データ書き出し・フォルダ指定・作成・変換関数 def url_get(): counter = 1 url = txb.get() html = requests.get(url) soup = BS(html.content, "html.parser") directory = Path(input_text.get() + "/original") os.makedirs(directory, exist_ok=True) for element in soup.find_all("img"): src = element.get("src") if src is None: continue image_url = urllib.parse.urljoin(url, src) print(image_url) imgdata = requests.get(image_url) file_name = image_url.split("/")[-1] if not file_name.endswith((".jpg", ".jpeg", ".png", ".gif")): txt = file_name.find("?") file_name = (file_name[:txt]) print(file_name) file_name = (str(counter) + "_" + file_name) out_path = directory.joinpath(file_name) with open(out_path, mode="wb") as f: a = f.write(imgdata.content) counter += 1 time.sleep(0.5) print(file_name) print("finish!!!!")

該当のソースコード

jinjaで実装しようとしているもの
URLを入れると画像を出す という流れにしたいと思っています。

python

app = Flask(__name__) @app.route("/top", methods=["GET"]) def input(): return render_template("input.html", title="TOP") @app.route("/", methods=["POST"]) def output(): counter = 1 name = request.form.get("name") URL = requests.get(name) soup = BS(URL.content, "html.parser") directory = Path("./static/gazou") os.makedirs(directory, exist_ok=True) for element in soup.find_all("img"): src = element.get("src") image_url = urllib.parse.urljoin(URL, src) imgdata = requests.get(image_url) file_name = image_url.split("/")[-1] if not file_name.endswith((".jpg", ".jpeg", ".png", ".gif")): txt = file_name.find("?") file_name = (file_name[:txt]) file_name = (str(counter) + "_" + file_name) out_path = directory.joinpath(file_name) with open(out_path, mode="wb") as f: a = f.write(imgdata.content) counter += 1 time.sleep(0.5) return render_template("output.html", name=name, title = "jinja難しい!!!") @app.route("/upload") def upload(): return render_template("upload.html") ###locakhost起動 if __name__ == "__main__": app.run(port=8080, debug=True, host='localhost')

エラーで引っかかってしまうところ

TypeError: Cannot mix str and non-str arguments
image_url = urllib.parse.urljoin(URL, src)

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

VScodeで書いてます。
htmlやCSSも別途で書いてます。
Python 3.9.4 です。
何もかもがゴリゴリの初心者です。

###追記(HTMLファイル)
base.html

html

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="../static/CSS/style.css"> <title>{{ title }}</title> </head> <body> <h1>ここが変換ベース?</h1> <p>{{file_name}}</p> {% block content %} <!-- ここに変換部分が挿入される?? --> {% endblock %} </body> </html>

input.html

html

{% extends "base.html" %} {% block content %} <form action="/top" method="GET" enctype="multipart/form-data"> <input type="url" id="url" name="URL" placeholder="URLを入力"> <input class="submit-button" value="実行" type="submit"> </form> {% endblock %}

output.html

html

{% extends "base.html" %} {% block content %} <p>{{ name }}</p> <p>{{ URL }}</p> <p>{{ html }}</p> <h1>あうとぷっとだよ!!</h1> <a href="/top">back top</a> {% endblock %}

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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