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

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

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

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

Django

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

1078閲覧

Djangoを使ってSeleniumでスクレイピングしたデータをローカルホストにアップしたいがエラー表示される。

sakanaku

総合スコア17

スクレイピング

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

Django

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Python

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2020/08/19 08:28

前提・実現したいこと

こんにちわ。python初学者です。

試しにDjangoを使ってスクレイピングしたデータをローカルホスト(127.0.0.1:8000/coll/)で読み込み表示させたいのですが、$python manage.py runserverをしてサイト(/coll)にアクセスすると下記のようなエラーが出てしまいます。

このスクレイピングコードの関数自体はDjango抜きでなら結果が返ってくるので、index.htmlとの連携?がうまくいっていないように感じます。こちらの関数のカスタマイズはどのようにしたら良いでしょうか??
下記のエラーコードは何の改善を求めていて、またどのようにしたら結果を表示さすことができるでしょうか?
ぜひ、ご教授願いたいです。よろしくお願いします。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/Users/uu/.local/share/virtualenvs/un-jT0daukl/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner response = get_response(request) File "/Users/uu/.local/share/virtualenvs/un-jT0daukl/lib/python3.8/site-packages/django/utils/deprecation.py", line 116, in __call__ response = self.process_response(request, response) File "/Users/uu/.local/share/virtualenvs/un-jT0daukl/lib/python3.8/site-packages/django/middleware/clickjacking.py", line 26, in process_response if response.get('X-Frame-Options') is not None: AttributeError: 'str' object has no attribute 'get' [19/Aug/2020 16:25:37] "GET /coll/ HTTP/1.1" 500 56825 Internal Server Error: /coll/

該当のソースコード

coll/views.py

from django.shortcuts import render from selenium import webdriver import chromedriver_binary from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options import time import urllib.request options = Options() options.headless = True options.add_argument('--headless') driver = webdriver.Chrome(options=options) driver.get("動的なwebサイト") def get_date(requests): selector = '要素' element = driver.find_elements_by_css_selector(selector) for a in element: return a.get_attribute("href") context = {'links': a} return render(requests, 'coll/index.html', context)

該当のソースコード

templates/coll/index.html

<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h1>Hello Django</h1> <p>{{ links }}</p> </body>

試したこと

掲載しているcoll/views.pyのコードを丸々変えてindex.htmlでローカルホスト(127.0.0.1:8000/coll/)に『Hello Django!!』とテキスト自体は表示さすことができたのでadmin.pyやsetting.pyの設定は問題はないと思っているのですが、、、もし追記で必要ならすぐにこちらに掲載させていただきたいです。

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

mac10.15.3
python3.8

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1element = driver.find_elements_by_css_selector(selector) 2for a in element: 3 return a.get_attribute("href") 4```ここで、`return`してるからではないでしょうか? 5この部分では、何をしたいのですか? 6*** 7#### 追記 8```Python 9# views.py 10def get_date(requests): 11 selector = '要素' 12 element = driver.find_elements_by_css_selector(selector) 13 element = [a.get_attribute("href") for a in element] # 追加 14 context = {'links': element} 15 return render(requests, 'coll/index.html', context)

HTML

1<!-- coll/index.html --> 2{% for link in links %} 3 {{link}} 4{% endfor %} 5```で表示できます。

投稿2020/08/19 10:22

編集2020/08/19 21:49
ForestSeo

総合スコア2720

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

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

sakanaku

2020/08/19 10:38

ご回答ありがとうございます。 a.get_attributeでwebサイトのhrefの中にあるurlをとって来たいのですが、、コードミスでしょうか?? 関数に入れてない時は、 for a in element: b = a.get_attribute("href") print(b) で出力できたのですが、returnの場合どのようにコードを書いたら関数を出力した時にhrefの中のリンクを取るような結果が上手く表示されるでしょうか?? すいません、ぜひよろしくお願いします。
ForestSeo

2020/08/19 11:02 編集

一回 return したらその場でその関数は終了します。 return render(・・・) は実行されません。
ForestSeo

2020/08/19 11:02 編集

回答を編集しました。 そちらをご覧ください
sakanaku

2020/08/19 14:53

すいません。丁寧にサンプルコードまで記載していただきありがとうございます。たった今、コードを記載したら無事にDjangoでスクレイピングデータをとってこれました。 ありがとうございます。 ただ、a.get_attribute("href")を消したことによりhrefの中のURLだけを取得することができなくなってしまいました。 a.get_attribute("href")を残したままのコードの書き方で何か良い方法はあるでしょうか?? 対象となるWebページのサンプルですがこんな感じです。 <a class="クラス名" target="_blank" href="取得したいURLの部分""></a> すいません、何度も申し訳ございません。
ForestSeo

2020/08/19 22:16 編集

リスト内包表記でできると思います。 追記しました。
sakanaku

2020/08/20 08:30

お疲れ様です。 element = driver.find_elements_by_css_selector(selector) element = [a.get_attribute("href") for a in element] こんな感じで変数を2回?(表現方法があっているか分かりませんが、、)書く方法を初めて知りました!! 上手いことスクレイピング結果を表示することができました。感動しました。 すいません。ご教授ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問