環境
・MacOS Ventura 13.2
・python3.10.4
・pyqt6(インストールが必要です。% python3 -m pip install pyqt6)
・requests(インストールが必要です。% python3 -m pip install requests)
WEBプラウザの代わりにwebサイトにアクセスしてHTTP
データの送受信を行うライブラリです。
作った理由
「Googleの急上昇ワード」を表示するWidgetを作成し、ついでにそのサイトを開けるように、QTextBrowser()オブジェクトを使ってリンクを設定して見ました。
QTextBrowser()オブジェクトを使ってリンクを設定するcodeは以下の通りです。 "Label"でもできるのですが、urlの折り返しができないため、横に長いwidgetになってしまいます。
ChatGPT曰く、QTextBrowser()オブジェクトを使えば希望通りになるとのことで使って見ました。
# label03(サイトのURLのリンクの表示と分割表示)
self.text_browser = QTextBrowser()
self.text_browser.setOpenLinks(False) # リンクを自動的に開かないようにする
self.text_browser.setHtml("取得data: <a href='https://trends.google.com/trends/trendingsearches/daily?geo=JP&hl=ja'>https://trends.google.com/trends/trendingsearches/daily?geo=JP&hl=ja</a>")
self.text_browser.anchorClicked.connect(self.open_link)
layout.addWidget(self.text_browser)
self.setLayout(layout)
# -----------------------------------------------------
def open_link(self, url: QUrl):
QDesktopServices.openUrl(url)
出来上がったWedget
Enterをクリックする
「Google急上昇ワード」が表示される
取得dataのリンクをクリックすると、webサイトが開く
<それでは下記のCodeをコピペして試して見てください>
#googleの急上昇ワードの検索
# ----------------------------------------------------------
import requests
from bs4 import BeautifulSoup
import pprint
# ----------------------------------------------------------
import sys
#from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QTextBrowser
from PyQt6.QtGui import QFont # fontの作成
from PyQt6.QtCore import QUrl #サイトのリンクを開く
from PyQt6.QtGui import QDesktopServices #サイトのリンクを開く
# ----------------------------------------------------------
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
# -----------------------------------------------------
def initUI(self):
#window titleの設定
self.setWindowTitle("Google急上昇Word")
# -------------------------------------------------
# layoutを設定
layout = QVBoxLayout()
self.setLayout(layout)
# -------------------------------------------------
# fontの作成
#font = QFont("Helvetica", 15, QFont.Weight.Normal)
# -------------------------------------------------
# Widgetの設定
# label01(Titleを表示するlabel)
self.lbl01 = QLabel("Google急上昇Word")
font1 = QFont("Helvetica", 20, QFont.Weight.Normal)
self.lbl01.setFont(font1)
self.lbl01.setStyleSheet("color:brown")
layout.addWidget(self.lbl01)
# -------------------------------------------------
# button01(Google 急上昇Wordを表示するButton)
self.btn01 = QPushButton('Enter',self,checkable=True)
self.btn01.clicked.connect(self.mainText)
layout.addWidget(self.btn01)
# -------------------------------------------------
# label02(Google 急上昇Wordを表示するlabel)
self.lbl02 = QLabel()
font2 = QFont("Helvetica", 15, QFont.Weight.Normal)
self.lbl02.setFont(font2)
self.lbl02.setStyleSheet("color:blue")
layout.addWidget(self.lbl02)
# -------------------------------------------------
# Widgetを終了するButton
self.btn_finish = QPushButton('Close',self,checkable=True)
self.btn_finish.clicked.connect(QApplication.quit)
layout.addWidget(self.btn_finish)
# -------------------------------------------------
# label03(サイトのURLのリンクの表示と分割表示)
self.text_browser = QTextBrowser()
self.text_browser.setOpenLinks(False) # リンクを自動的に開かないようにする
self.text_browser.setHtml("取得data: <a href='https://trends.google.com/trends/trendingsearches/daily?geo=JP&hl=ja'>https://trends.google.com/trends/trendingsearches/daily?geo=JP&hl=ja</a>")
self.text_browser.anchorClicked.connect(self.open_link)
layout.addWidget(self.text_browser)
self.setLayout(layout)
# -----------------------------------------------------
def open_link(self, url: QUrl):
QDesktopServices.openUrl(url)
# -----------------------------------------------------
def mainText(self, event):
# 下記に説明
url = "https://trends.google.com/trends/trendingsearches/daily/rss?geo=JP"
response = requests.get(url)
soup = BeautifulSoup(response.text, "xml")
# タイトルを取得し、リストに格納
keywords = []
for item in soup.find_all("item"):
title = item.find("title").text
keywords.append(title)
self.lbl02.setText("\n".join(keywords))
# ----------------------------------------------------------
if __name__=='__main__':
app = QApplication(sys.argv)
window = MainWindow()
# ここでクラスの頭に飛ぶ
window.show()
app.exec()
このprogramで使用しているURLについて
chatGPTが教えてくれたurlは以下の通りでした。
url = "https://trends.google.co.jp/trends/trendingsearches/daily/rss?geo=JP"
webサイトをから取得すると次の通りのurlでした。
url = "https://trends.google.com/trends/trendingsearches/daily?geo=JP&hl=ja"
chatGPTに、このサイトの取得方法を聞いたところ
「申し訳ありませんが、私の知識は2021年9月までの情報しか持っておりませんので、直近の情報を提供することができません。URLの提供元や最新のデータについては、2023年6月時点の情報を確認する必要があります。」とのこと。
仕方ないので、上記の”trendingsearches/”以下をchatGPTの回答の”daily/rss?geo=JP"へ変更して見たところ
url = "https://trends.google.com/trends/trendingsearches/daily/rss?geo=JP"
CahtGPTが教えてくれたものとほぼ同じサイトが開きました。
(ざっと見た感じ)違う点は
<atom:link href="https://trends.google.co.jp/trends/trendingsearches/daily/rss?geo=JP" rel="self" type="application/rss+xml"/>
↓
<atom:link href="https://trends.google.com/trends/trendingsearches/daily/rss?geo=JP" rel="self" type="application/rss+xml"/>
くらいでした。
urlで開いたサイトの上部に
This XML file does not appear to have any style information associated with it. The document tree is shown below.
(この XML ファイルには、関連付けられたスタイル情報がないようです。 ドキュメントツリーを以下に示します。)と表示があったので、chatGPTに聞いて見た回答が以下です。
私にはあまり理解できませんが、このサイトからdataを取得する方が分かりやすいので、まあいいかで終わりました。
関連付けられたスタイル情報がないXMLファイルになる理由は、
/daily/rss?geo=JPという変更によって表示されるXMLファイルの構造が変わったためです。
元のURL"/daily?geo=JP&hl=ja"は、地理情報(geo=JP)と言語設定(hl=ja)のパラメータを持つ特定のリソースを指し示しています。これにより、日本の地域に関連する情報を日本語で取得することができます。また、リクエストに応じて関連するスタイル情報も提供される可能性があります。
一方、変更後のURL"/daily/rss?geo=JP"は、より特定のリソースを指し示しています。この場合、XML形式のフィード(RSS)を取得するためのリクエストです。RSSフィードは通常、情報の配信や共有に使用される標準的な形式ですが、スタイル情報は含まれていません。RSSフィードは主にテキストデータを含み、通常は表示に関連するスタイル情報は別の方法で提供されます(たとえば、RSSリーダーなどがスタイル情報を提供することがあります)。
したがって、"/daily/rss?geo=JP"というURLでは、スタイル情報が含まれていないXMLファイルが提供されることになります。ただし、具体的なシナリオや使用されているシステムによっては、XMLファイルにスタイル情報が含まれている可能性もあります。この場合、XMLファイル自体がスタイル情報を提供しているか、別の手段でスタイル情報を取得する必要があります。
関係リンク
"ChatGPT for Mac" をインストールして使ってみた。
https://qiita.com/ti104110/items/40563e13d9f389bd62bd
tkinter がうまくいかないので、PyQt6でWidget(ウィジェット)に挑戦(その1)
https://qiita.com/ti104110/items/0c0800cff58cd10b9676
tkinter がうまくいかないので、PyQt6でWidget(ウィジェット)に挑戦(その2)RadioButtonで選択してWebを開く
https://qiita.com/ti104110/items/7785758f98ef978c2d97
tkinter がうまくいかないので、PyQt6でWidget(ウィジェット)に挑戦(その3)QGridLayout()オブジェクトを使って、labelとQLineEditを横並びに表示
https://qiita.com/ti104110/items/a35263176ff5ddaafac7
tkinter がうまくいかないので、PyQt6でWidget(ウィジェット)に挑戦(その4)自作programをRadiButtonでリスト化
https://qiita.com/ti104110/items/dc07bcb2d0fa7a9ff269