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

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

ただいまの
回答率

87.48%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,035
退会済みユーザー

退会済みユーザー

イメージ説明

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

import tkinter as tk
import requests
from bs4 import BeautifulSoup
from functools import partial


### この下に関数を書く ###

def load_url():
    # Webページを取得して解析する
    load_url = urlFld.get()
    html = requests.get(load_url)
    soup = BeautifulSoup(html.content, "html.parser")

    # HTML全体を表示する
    listappend = partial(msgList.insert, tk.END)
    listappend(soup)
    listappend('------------------------------------------------------')

def tag_select(laod_url):
    t1 = tagFld.get()
    # タグを検索して表示する
    listappend(soup.find(t1).text)    # タグを検索して表示



if __name__ == "__main__":
    # Main Window
    win = tk.Tk()
    # Window Title
    win.title("MediaInfo App")
    # Window Size
    win.geometry("500x550")
    # Window Resizable
    #win.resizable(0,0)
    # Window Background
    win.configure(bg="#52514F")

### この下に描画内容を書く ###
    #メインフレーム
    mFrm = tk.Frame(win)
    mFrm.configure(bg="#52514F")
    mFrm.pack(padx=3, pady=3, fill="both", expand=1)

    # HTML表示画面
    msgList = tk.Listbox(mFrm)
    msgList.configure(height=20, width=50)
    msgList.pack(padx=10, pady=10)

    # URL 入力ボタン用のフレーム
    urlFrm = tk.LabelFrame(mFrm)
    urlFrm.configure(text="Entry URL", fg="white", bg="#52514F", padx="20", pady="10")
    urlFrm.pack(pady=5)

    # URL ラベル
    urlTxt = tk.Label(urlFrm)
    urlTxt.configure(text="URL", fg="white", bg="#52514F", font=('Helvetica', 10))
    urlTxt.pack(side="left", padx=5) 

    # URL 入力
    urlFld = tk.Entry(urlFrm)
    urlFld.configure(fg="black", highlightbackground="#52514F")
    urlFld.pack(side="left", padx=5)

    # URL入力ボタン
    urlBtn = tk.Button(urlFrm)
    urlBtn.configure(text="Load URL", command=load_url)
    urlBtn.pack(side="right", padx=5)

    # HTML内 Tag 入力ボタン用のフレーム
    tagFrm = tk.LabelFrame(mFrm)
    tagFrm.configure(text="Entry Tag", fg="white", bg="#52514F", padx="20", pady="10")
    tagFrm.pack(pady=5)

    # HTML内 Tag ラベル
    tagTxt = tk.Label(tagFrm)
    tagTxt.configure(text="Tag", fg="white", bg="#52514F", font=('Helvetica', 10))
    tagTxt.pack(side="left", padx=5) 

    # HTML内 Tag 入力
    tagFld = tk.Entry(tagFrm)
    tagFld.configure(fg="black", highlightbackground="#52514F")
    tagFld.pack(side="left", padx=5)

    # HTML内 Tag入力ボタン
    tagBtn = tk.Button(tagFrm)
    tagBtn.configure(text="Select Tag", command=tag_select)
    tagBtn.pack(side="right", padx=5)



    # 描画
    win.mainloop()

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

宜しく御願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2020/09/28 11:51

    何か問題があるのですか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/09/28 11:57

    Undefined variable 'listappend'
    Undefined variable 'soup'
    Redefining name 'load_url' from outer scope (line 9)
    Unused argument 'laod_url'

    上記のエラーが発生しております。

    キャンセル

回答 1

0

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

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

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

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

def load_url():
    load_url = urlFld.get()
    html = requests.get(load_url)
    soup = BeautifulSoup(html.content, "html.parser")
    lst.append(soup)

if __name__ == '__main__':
    lst = []
    root = tk.Tk()
    .
    .

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

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

html = requests.get(url)
soup = BeautifulSoup(html.content, 'html.parser')

td = soup.find('td') # 一番初めのtd要素が返ってくる
tr_list = soup.find_all('tr') # ページ内全てのtr要素が返ってくる

input = soup.find('input', id='hoge') # 探したい要素が複数ある場合,左記でidを指定出来る
span = soup.find('span', class_='fuga') # クラスを指定する場合はアンダーバーを。(classはpythonの予約語である為)
midashi = soup.find('h3', {'name':'piyo'}) # クラスとID以外の属性は辞書型で探索

link_tag = soup.find('a') # 抽出した要素はタグで返ってくる為
link_url = link_tag.get('href') # .get()を使用してhrefを抽出

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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