2024-01-08

QWebEnginePage から HTML ソースを取得する ~ PySide6

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。

本ブログではすでに QWebEngineView クラスを利用したシンプルなインターネットブラウザを何度か紹介してきました。

Google Chrome をはじめ無料で利用できる汎用で高機能なインターネットブラウザが利用できるのに、同等な機能を備えたウィジェットを利用したくなるのは、特定のウェブサイトの内容を取得して、解析や整理、その他いろいろなことをしたい場合に、プログラム的なアプローチが取れて便利だからです。

そのためには表示されているサイトの内容 (HTML) をプログラム的に取得できることが必要です。ということで、今回は、QWebEngineView で表示したサイトの HTML を取得する簡単なサンプルの紹介をします。

今回のテーマ
  • QWebEngineView で読み込んだ URL は、QWebEnginePage に表示されますが、ここに表示されたウェブサイトの HTML のソースを取得します。

なお、本サンプルで使用しているウェブサイトは、下記を利用しています。

下記の OS 環境で動作確認をしています。

Fedora Workstation 39 x86_64
Python 3.12.1
PySide6 6.6.1

サンプルを以下に示します。このサンプルは、指定した URL を表示して、そのソースを標準出力するという単純なものです。

qt_webenginepage.py

このサンプルの実行例を以下に示しました。

qt_webenginepage.py の実行例

表示された HTML の内容が標準出力されます。

qt_webenginepage.py の出力例
doh set to ""  --  SystemOnly
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<!-- Google tag (gtag.js) -->
<script type="text/javascript" async="" src="https://ssl.google-analytics.com/ga.js"></script><script async="" src="https://www.googletagmanager.com/gtag/js?id=G-ZML74SB67X"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-ZML74SB67X');
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta name="keywords" content="パンダ,ジャイアントパンダ,上野パンダ,上野動物園,上野,保護,サポート基金,ZOONET">
<meta name="description" content="東京動物園協会の運営する「UENO-PANDA.JP」は、上野動物園のジャイアントパンダを紹介する公式サイトです。ジャイアントパンダの個体情報をはじめ、上野動物園へのアクセス、開園時間、園内マップ、その他ジャイアントパンダ保護サポート基金等、さまざまな情報を掲載しています。">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0">
<link rel="shortcut icon" href="//www.ueno-panda.jp/favicon.ico" type="image/x-icon">
<link rel="icon" href="//www.ueno-panda.jp/favicon.ico" type="image/x-icon">

<title>上野動物園のジャイアントパンダ情報サイト「UENO-PANDA.JP」</title>
   :
   :
(以下省略)

QWebEingineView クラスを継承した Example クラスで、引数で与えられた URL の読み込みを完了すると発生する loadFinished シグナルを、on_load_finished メソッド(スロット)に接続します。

Example クラスの on_load_finished メソッド
class Example(QWebEngineView):
    def __init__(self, url: QUrl):
        super().__init__()
        self.load(url)
        self.loadFinished.connect(self.on_load_finished)
           :
           :

QWebEngineView 内の URL を表示している QWebEnginePage のインスタンスに対して、runJavaScript メソッドで指定した Javascript を実行しています。その結果をスタティックメソッド print_html に渡して出力しています。

このサンプルで使用している Javascript は、DOM の ルートの要素 document.documentElement における outerHTML プロパティを取り出しているだけです。

Example クラスの on_load_finished メソッド
    def on_load_finished(self, flag: bool) -> bool:
        if not flag:
            return False
        page: QWebEnginePage = self.page()
        page.runJavaScript(
            "document.documentElement.outerHTML",
            0, self.print_html
        )
        return True

今回は取り出した HTML の内容を標準出力しているだけですが、用途に応じていろいろと応用できると思います。

参考サイト

  1. QWebEngineView - Qt for Python
  2. QWebEnginePage - Qt for Python

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

0 件のコメント: