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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Python

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

Q&A

解決済

1回答

1077閲覧

Webブラウザに履歴機能とフィルタリングを実装したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/05/27 10:10

前提・実現したいこと

私はPythonとpyqt5を用いて軽量で原始的なWebブラウザを作成しています
(これは学校のパソコンがあまりに致命的なための無駄な作業ですが...)
私は現在3つの機能を実現しようとしましたが、力不足で実現するための方法が見つかりません

1つ目は 新しいタブを作成して過去のタブを削除した際にYoutubeなどで流した音源が消えずに残ってしまうということ
2つ目は 履歴を作るための機能が一切わからないこと(少なくとも私の検索技術は幼稚すぎたようです 調べても何も理解できませんでした)
3つ目は 特定のワードを検索・入力できないようにすること(これは教員が心配するためです 例えばポルノサイトなどへのアクセス)

これらを作成するためのソースコードや理論 サイトを教えていただけるとありがたいです
勿論、自分で四苦八苦して検索してなんども繰り返し練習をしたいところですが、残念ながら私には時間がもうあまり多くありません

真面目なエンジニアの方は付き合いきれん!自分で考えてやるのがプログラムだ!というところでしょう...お気持ちはわかります
ですのがもし助けてくれる方がもしいらっしゃれば回答 返信 をお願い致します

該当のソースコード

Python

1# importing required libraries 2from PyQt5.QtCore import * 3from PyQt5.QtWidgets import * 4from PyQt5.QtGui import * 5from PyQt5.QtWebEngineWidgets import * 6from PyQt5.QtPrintSupport import * 7import os 8import sys 9 10 11class MainWindow(QMainWindow): 12 13 14 def __init__(self, *args, **kwargs): 15 super(MainWindow, self).__init__(*args, **kwargs) 16 17 18 self.tabs = QTabWidget() 19 20 21 self.tabs.setDocumentMode(True) 22 23 24 self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick) 25 26 27 self.tabs.currentChanged.connect(self.current_tab_changed) 28 29 30 self.tabs.setTabsClosable(True) 31 32 33 self.tabs.tabCloseRequested.connect(self.close_current_tab) 34 35 36 self.setCentralWidget(self.tabs) 37 38 39 self.status = QStatusBar() 40 41 42 self.setStatusBar(self.status) 43 44 45 navtb = QToolBar("ツールバーを非表示") 46 47 48 self.addToolBar(navtb) 49 50 51 back_btn = QAction("1ページ戻る", self) 52 53 54 back_btn.setStatusTip("Back to previous page") 55 56 57 58 back_btn.triggered.connect(lambda: self.tabs.currentWidget().back()) 59 60 61 navtb.addAction(back_btn) 62 63 64 next_btn = QAction("1ページ前へ", self) 65 next_btn.setStatusTip("Forward to next page") 66 next_btn.triggered.connect(lambda: self.tabs.currentWidget().forward()) 67 navtb.addAction(next_btn) 68 69 70 reload_btn = QAction("更新", self) 71 reload_btn.setStatusTip("Reload page") 72 reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload()) 73 navtb.addAction(reload_btn) 74 75 76 home_btn = QAction("ホーム", self) 77 home_btn.setStatusTip("Go home") 78 79 80 home_btn.triggered.connect(self.navigate_home) 81 navtb.addAction(home_btn) 82 83 84 navtb.addSeparator() 85 86 87 self.urlbar = QLineEdit() 88 89 90 self.urlbar.returnPressed.connect(self.navigate_to_url) 91 92 93 navtb.addWidget(self.urlbar) 94 95 96 stop_btn = QAction("ストップ", self) 97 stop_btn.setStatusTip("Stop loading current page") 98 stop_btn.triggered.connect(lambda: self.tabs.currentWidget().stop()) 99 navtb.addAction(stop_btn) 100 101 102 self.add_new_tab(QUrl('http://www.google.com'), 'Homepage') 103 104 105 self.show() 106 107 108 self.setWindowTitle("BASIC BROWSER") 109 110 111 def add_new_tab(self, qurl = None, label ="Blank"): 112 113 114 if qurl is None: 115 116 qurl = QUrl('http://www.google.com') 117 118 119 browser = QWebEngineView() 120 121 122 browser.setUrl(qurl) 123 124 125 i = self.tabs.addTab(browser, label) 126 self.tabs.setCurrentIndex(i) 127 128 browser.urlChanged.connect(lambda qurl, browser = browser: 129 self.update_urlbar(qurl, browser)) 130 131 browser.loadFinished.connect(lambda _, i = i, browser = browser: 132 self.tabs.setTabText(i, browser.page().title())) 133 134 135 def tab_open_doubleclick(self, i): 136 137 if i == -1: 138 139 self.add_new_tab() 140 141 142 def current_tab_changed(self, i): 143 144 145 qurl = self.tabs.currentWidget().url() 146 147 148 self.update_urlbar(qurl, self.tabs.currentWidget()) 149 150 151 self.update_title(self.tabs.currentWidget()) 152 153 154 def close_current_tab(self, i): 155 156 157 if self.tabs.count() < 2: 158 159 return 160 161 162 self.tabs.removeTab(i) 163 164 165 def update_title(self, browser): 166 167 168 if browser != self.tabs.currentWidget(): 169 # do nothing 170 return 171 172 173 title = self.tabs.currentWidget().page().title() 174 175 176 self.setWindowTitle("% s - BASIC BROWSER" % title) 177 178 # action to go to home 179 def navigate_home(self): 180 181 # go to google 182 self.tabs.currentWidget().setUrl(QUrl("http://www.google.com")) 183 184 # method for navigate to url 185 def navigate_to_url(self): 186 187 188 q = QUrl(self.urlbar.text()) 189 190 191 if q.scheme() == "": 192 # set scheme 193 q.setScheme("http") 194 195 196 self.tabs.currentWidget().setUrl(q) 197 198 # method to update the url 199 def update_urlbar(self, q, browser = None): 200 201 # If this signal is not from the current tab, ignore 202 if browser != self.tabs.currentWidget(): 203 204 return 205 206 # set text to the url bar 207 self.urlbar.setText(q.toString()) 208 209 # set cursor position 210 self.urlbar.setCursorPosition(0) 211 212app = QApplication(sys.argv) 213 214app.setApplicationName("BASIC BROWSER") 215 216window = MainWindow() 217 218app.exec_()

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

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

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

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

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

guest

回答1

0

ベストアンサー

1つ目は 新しいタブを作成して過去のタブを削除した際にYoutubeなどで流した音源が消えずに残ってしまうということ

  • QTabWidget の使い方。

 タブを閉じた時に、内部のウィジェットを破棄する必要があります。
tabCloseRequested (close_current_tab) 内で、 deleteLater

  • QWebEngineView() の親ウィジェットが指定されていない。

 孤立したウィジェットなので、親オブジェクトが破棄されたときに、自動的に破棄されません。
アプリケーション終了時であればあまり問題はありませんが、
例えば、tabwidget が破棄された後でも残り続けます。

python

1# add_new_tab 内、通常は配置する親ウィジェットを指定しておく 2 3 browser = QWebEngineView(self.tabs) 4 5# close_current_tab内、removeTab 前に 6 7 self.tabs.widget(i).deleteLater()

2つ目は 履歴を作るための機能が一切わからないこと

 履歴の各アイテム QWebEngineHistoryItem は、アイコンURL, URL, タイトル, アクセス日時の情報を持ちます。


3つ目は 特定のワードを検索・入力できないようにすること(これは教員が心配するためです 例えばポルノサイトなどへのアクセス)

「入力を出来ないようにする」 ... UI の時点で入力を防ぐ。
選択入力、コピーペーストで入力、URL欄への入力等、様々なケースへの対応が必要
「検索を出来ないようにする」 ... HTTPリクエストでのフィルターリング。
QWebEngineUrlRequestInterceptor

時間がないのであれば、入力チェックは対策に手間がかかるうえに確実な方法ではないので
ルーターやプロバイダ等、上流でのフィルタリングが導入できるように働きかけた方が良いです。


「入力チェック」のみに絞って回答すると

  • 想定する入力欄を全てリストアップ

 URL 欄、URLのクエリ文字、ページ内の入力欄、他

  • ページ内の入力欄については、Python側で直接制御できないので

 ページを読み込んだ後に、JavaScript で DOM 操作
禁則ワードチェックを呼び出すイベントリスナーを仕込む。

 一般的な多くのケースには対応できると思いますが、
ページにフレームが使われている場合や、動的に後から入力欄が生成される場合、
抜け道になりそうな方法が多数考えられます。
→ 確実な方法はなく、全てに対策するのは労力がかかる

投稿2021/05/28 03:10

編集2021/05/29 04:27
teamikl

総合スコア8664

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

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

退会済みユーザー

退会済みユーザー

2021/05/28 14:12

丁寧な回答ありがとうございます!! 今から一つ一つ試して行こうと思います!
退会済みユーザー

退会済みユーザー

2021/05/28 15:01

履歴を作り機能についての質問なのですが 履歴を特定のフォルダに作成し txt形式で蓄積しておくことは可能でしょうか? 例 Program/Browser/History History.txt 2021/05/29 12:39 [https://google.com] のような
teamikl

2021/05/29 04:32 編集

その様な形式のアクセスログなら、logging モジュールを使うのが手軽です。 質問の範囲が漠然としてて解りませんが、 一つづつ個別に取り組んだ方が良いと思います。 - フォルダの作成 os.mkdirs - ファイルの入出力 open - 必要な情報 (URL, 日時) の所得 → 回答済 - どのタイミングで記録するか → urlChanged, loadFinished 追記: 実用的にするなら、他に障害時の処理や 複数プロセスを起動した場合の排他制御も必要になるので、 組込データベース(sqlite3等)の利用を検討してください。
退会済みユーザー

退会済みユーザー

2021/05/29 09:11

なるほど!丁寧に回答ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問