質問: tk.Button(tagFrm) tagBtn.configure(text="Select Tag", command=tag_select) tagBtn.pack(side="right", padx=5) # 描画 win.mainloop() ``` 1 HTMLの表示を改行させて表示したい。 2def load_urlで使ったsoup, listappendの値をdef tag_selectでも使えるようにしたい。 3スクレイピングしたいTagが複数ある時の為にタグ検索をして表示するコードはどのように書けば良いのか教えて欲しいです。 宜しく御願い致します。
回答: > > 1 HTMLの表示を改行させて表示したい。 > > > 表示の為であればリストボックスを使用すべきではないと思います。 ソースの全表示を目的とするならばTextウィジェットを使用するとよいでしょう。 またhtmlを改行させ表示させるとなるとページ構成にもよりますが数千行に渡る場合もあります。 であれば``を抽出し、ページタイトルをリストに追加していくなどが良いのではないでしょうか。 > > 2def 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() . . ``` > > 3スクレイピングしたい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を抽出 ```