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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

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

Q&A

解決済

1回答

1928閲覧

【Django】フォームにURLを入力しsubmitすると、そのURLをスクレイピングして文章を表示する機能を作成したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

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

0グッド

0クリップ

投稿2019/07/15 06:41

編集2019/07/15 07:57

現在Djangoでフォームを作成しているのですが、入力した値をそのまま表示する処理は動作するのですが、入力した値に何か処理を加えて(今回の例ではスクレイピング)、その結果得られた値を表示する機能が作成できないで困っています。

例えば、フォームにyahoo.comと入力した場合、そのURLでの本文を取得し表示。

下記はローカルでhttp://localhost:8000/index/にアクセスした際に起こるエラーです。

エラーの内容

・urlがNoneの場合の処理をviews.pyに追加

Python

1#Views.py 2from django.http.response import HttpResponse 3import requests 4from bs4 import BeautifulSoup 5 6def index(request): 7 8 url = request.GET.get('url') 9 10 if url == None: 11 d = { 12 'category' : "urlを入力して下さい。" 13 } 14 else: 15 # 入力されたURLでの本文を取得する。 16 r = requests.get(url) 17 soup = BeautifulSoup(r.text, 'lxml') 18 doc = soup.find_all('p') 19 20 #取得した本文を形態素解析し、名詞のみ抽出 21 word_list='' 22 for text in doc: 23 m = MeCab.Tagger() 24 m_text = m.parse(text.text) 25 for row in m_text.split("\n"): 26 word =row.split("\t")[0]#タブ区切りになっている1つ目を取り出す。ここには形態素が格納されている 27 if word == "EOS": 28 break 29 else: 30 pos = row.split("\t")[1]#タブ区切りになっている2つ目を取り出す。ここには品詞が格納されている 31 slice = pos[:2] 32 if slice == "名詞": 33 word_list = word_list +" "+ word 34 35 d = { 36 'category': word_list 37 } 38 39 return render(request, 'classifier/index.html',d) 40

Python

1#index.html 2{% extends "classifier/base.html" %} 3 4{% block section %} 5<form action = "" method="get"> 6 <label>URL:<input type="url" size = "30" name ="url"> 7 <input type="submit" value="送信"> 8 </label> 9</form> 10 11{% if category %} 12<p>{{category}}</p><br> 13{% endif %} 14{% endblock %}

かれこれ3時間ほど悩んでいるのですが、解決できません。。よろしくお願いします。

また、エラーの解決に必要なファイルがあれば追加するので、お申し付けください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ただアクセスしたときにはGETで送られるものがなく、 url = request.GET.get('url') の値が None になってしまいます。
None の時にはスクレイピングを行わないようにif文を追加したらどうでしょう。

投稿2019/07/15 07:28

mistn

総合スコア1191

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

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

退会済みユーザー

退会済みユーザー

2019/07/15 08:02

ご回答ありがとうございます。 追加すると動きました! しかし、新たな問題が1つあります。 ・URLを入力し送信した時;スクレイピングの結果が表示 は問題なく動くのですが、index.htmlにアクセスした際に、URLがNoneの場合のメッセージが送信ボタンを押すことなく初めから表示されてしまいます。。 申し訳ありませんが、こちらもご教示願えないでしょうか。 私としては、送信ボタンを押すことでviews.pyのコードが作動すると思っていたのですが、間違いなのでしょうか?
退会済みユーザー

退会済みユーザー

2019/07/15 08:04

そしてURLを入力するフォームが空白の状態で送信を押すと、質問内容に記載しているエラーが出てしまいます。。
退会済みユーザー

退会済みユーザー

2019/07/15 08:37

上手くいきました! 本当に助かりました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問