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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

1回答

2129閲覧

[Python初心者] WebスクレイピングをGUI上で行いたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2020/09/28 02:44

編集2020/09/28 02:58

イメージ説明

上記のようなGUIでURLを入力して、message boxに表示し、必要な部分を確認後にTagを入力してその部分をCVSで出力できるようなGUIを作りたいと考えています。

Python

1import tkinter as tk 2import requests 3from bs4 import BeautifulSoup 4from functools import partial 5 6 7### この下に関数を書く ### 8 9def load_url(): 10 # Webページを取得して解析する 11 load_url = urlFld.get() 12 html = requests.get(load_url) 13 soup = BeautifulSoup(html.content, "html.parser") 14 15 # HTML全体を表示する 16 listappend = partial(msgList.insert, tk.END) 17 listappend(soup) 18 listappend('------------------------------------------------------') 19 20def tag_select(laod_url): 21 t1 = tagFld.get() 22 # タグを検索して表示する 23 listappend(soup.find(t1).text) # タグを検索して表示 24 25 26 27if __name__ == "__main__": 28 # Main Window 29 win = tk.Tk() 30 # Window Title 31 win.title("MediaInfo App") 32 # Window Size 33 win.geometry("500x550") 34 # Window Resizable 35 #win.resizable(0,0) 36 # Window Background 37 win.configure(bg="#52514F") 38 39### この下に描画内容を書く ### 40 #メインフレーム 41 mFrm = tk.Frame(win) 42 mFrm.configure(bg="#52514F") 43 mFrm.pack(padx=3, pady=3, fill="both", expand=1) 44 45 # HTML表示画面 46 msgList = tk.Listbox(mFrm) 47 msgList.configure(height=20, width=50) 48 msgList.pack(padx=10, pady=10) 49 50 # URL 入力ボタン用のフレーム 51 urlFrm = tk.LabelFrame(mFrm) 52 urlFrm.configure(text="Entry URL", fg="white", bg="#52514F", padx="20", pady="10") 53 urlFrm.pack(pady=5) 54 55 # URL ラベル 56 urlTxt = tk.Label(urlFrm) 57 urlTxt.configure(text="URL", fg="white", bg="#52514F", font=('Helvetica', 10)) 58 urlTxt.pack(side="left", padx=5) 59 60 # URL 入力 61 urlFld = tk.Entry(urlFrm) 62 urlFld.configure(fg="black", highlightbackground="#52514F") 63 urlFld.pack(side="left", padx=5) 64 65 # URL入力ボタン 66 urlBtn = tk.Button(urlFrm) 67 urlBtn.configure(text="Load URL", command=load_url) 68 urlBtn.pack(side="right", padx=5) 69 70 # HTML内 Tag 入力ボタン用のフレーム 71 tagFrm = tk.LabelFrame(mFrm) 72 tagFrm.configure(text="Entry Tag", fg="white", bg="#52514F", padx="20", pady="10") 73 tagFrm.pack(pady=5) 74 75 # HTML内 Tag ラベル 76 tagTxt = tk.Label(tagFrm) 77 tagTxt.configure(text="Tag", fg="white", bg="#52514F", font=('Helvetica', 10)) 78 tagTxt.pack(side="left", padx=5) 79 80 # HTML内 Tag 入力 81 tagFld = tk.Entry(tagFrm) 82 tagFld.configure(fg="black", highlightbackground="#52514F") 83 tagFld.pack(side="left", padx=5) 84 85 # HTML内 Tag入力ボタン 86 tagBtn = tk.Button(tagFrm) 87 tagBtn.configure(text="Select Tag", command=tag_select) 88 tagBtn.pack(side="right", padx=5) 89 90 91 92 # 描画 93 win.mainloop()

① HTMLの表示を改行させて表示したい。
②def load_urlで使ったsoup, listappendの値をdef tag_selectでも使えるようにしたい。
③スクレイピングしたいTagが複数ある時の為にタグ検索をして表示するコードはどのように書けば良いのか教えて欲しいです。

宜しく御願い致します。

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

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

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

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

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

coco_bauer

2020/09/28 02:51

何か問題があるのですか?
退会済みユーザー

退会済みユーザー

2020/09/28 02:57

Undefined variable 'listappend' Undefined variable 'soup' Redefining name 'load_url' from outer scope (line 9) Unused argument 'laod_url' 上記のエラーが発生しております。
guest

回答1

0

① HTMLの表示を改行させて表示したい。

表示の為であればリストボックスを使用すべきではないと思います。
ソースの全表示を目的とするならばTextウィジェットを使用するとよいでしょう。
またhtmlを改行させ表示させるとなるとページ構成にもよりますが数千行に渡る場合もあります。
であれば<title></title>を抽出し、ページタイトルをリストに追加していくなどが良いのではないでしょうか。

②def load_urlで使ったsoup, listappendの値をdef tag_selectでも使えるようにしたい。

listappendについては何の変数に代入されているわけでもなく、そのままListBoxウィジェットに
挿入されてしまっている為、一度変数に代入する事で、その他の処理にもその変数を応用出来ると思います。
soupについては、既に対象のURLをrequests+BeautifulSoupで情報を取得と情報の成形をし
soupという変数に代入されているものとなりますので、そのままその後の処理などを記述する際に応用が出来ると思います。
関数の外に予めリストを用意しておき、関数を実行した時にsoup情報を外のリストに追加するなどすれば
あとから過去のsoupを再利用出来ます。

python

1def load_url(): 2 load_url = urlFld.get() 3 html = requests.get(load_url) 4 soup = BeautifulSoup(html.content, "html.parser") 5 lst.append(soup) 6 7if __name__ == '__main__': 8 lst = [] 9 root = tk.Tk() 10 . 11 .

③スクレイピングしたいTagが複数ある時の為にタグ検索をして表示するコードはどのように書けば良いのか教えて欲しいです。

やや、スクレイピングというものについて解釈に齟齬がある様ですが
おおまかに申し上げますと
『タグを指定して要素を抽出する』という所作をスクレイピングとは言いません。
文字通り『抽出』という称し方が一般的でしょう。
html = requests.get(load_url)
の部分がスクレイピングと言えるでしょう。
『requestsモジュールを使用してリクエストを送り、返ってきた情報を変数に格納する』
という動作になり、この動作がスクレイピングと呼ばれます。
BeautifulSoupはHTMLやXMLファイルからデータを取得
→パーサーを使って要素の探索を行う事が出来るといった感じの便利なライブラリとなります。
soupが抽出元の根幹となる為、複数の要素を抽出したい場合には以下の様に何度でもsoupを参照すればよいだけです。

python

1html = requests.get(url) 2soup = BeautifulSoup(html.content, 'html.parser') 3 4td = soup.find('td') # 一番初めのtd要素が返ってくる 5tr_list = soup.find_all('tr') # ページ内全てのtr要素が返ってくる 6 7input = soup.find('input', id='hoge') # 探したい要素が複数ある場合,左記でidを指定出来る 8span = soup.find('span', class_='fuga') # クラスを指定する場合はアンダーバーを。(classはpythonの予約語である為) 9midashi = soup.find('h3', {'name':'piyo'}) # クラスとID以外の属性は辞書型で探索 10 11link_tag = soup.find('a') # 抽出した要素はタグで返ってくる為 12link_url = link_tag.get('href') # .get()を使用してhrefを抽出 13

投稿2020/09/28 03:37

編集2020/09/28 03:43
nto

総合スコア1438

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問