如何使用PyQt5 v5.6 QWebEngineView"渲染"HTML?
我之前使用PyQt5 v5.4.1 QWebPage执行了该任务,但建议尝试使用较新的QWebEngineView.
这是实现(它通常按预期工作,但有一些站点和情况无限期挂起):
def render(source_html):
"""Fully render HTML, JavaScript and all."""
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebKitWidgets import QWebPage
class Render(QWebPage):
def __init__(self, html):
self.html = None
self.app = QApplication(sys.argv)
QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
self.mainFrame().setHtml(html)
self.app.exec_()
def _loadFinished(self, result):
self.html = self.mainFrame().toHtml()
self.app.quit()
return Render(source_html).html
import requests
sample_html = requests.get(dummy_url).text
print(render(sample_html))
Run Code Online (Sandbox Code Playgroud)
以下是我尝试使用QWebEngineView.首先,在Ubuntu上安装和设置PyQt5 v5.6:
# install PyQt5 v5.6 wheel from PyPI
pip3 install --user pyqt5
# link missing resources
ln -s ../resources/icudtl.dat ../resources/qtwebengine_resources.pak …
Run Code Online (Sandbox Code Playgroud) 我试图找出如何从多行记录中提取特定字段\n\n
.
在这种情况下,它碰巧从apt-cache输出,类似于DEBIAN控制文件.见输出apt-cache show "$package"
Package: caffeine
Priority: optional
Section: misc
Installed-Size: 641
Maintainer: Reuben Thomas <rrt@sc3d.org>
Architecture: all
Version: 2.8.3
Depends: python3:any (>= 3.3.2-2~), python3, gir1.2-gtk-3.0, gir1.2-appindicator3-0.1, python3-xlib, python3-pkg-resources, libnet-dbus-perl
Filename: pool/main/c/caffeine/caffeine_2.8.3_all.deb
Size: 58774
MD5sum: 4438db3f6d1cf43a4f4b49cc7f24cda0
SHA1: e748370ac5ccd7de6fc9466ce0451d2e90d179d4
SHA256: ae303b4e32949cc1e1af80df7217e3406291679e3f18fa8f78a5bbb97504c4f6
Description-en: Prevent the desktop becoming idle in full-screen mode
Caffeine stops the desktop becoming idle when an application
is running full-screen. A desktop indicator ‘caffeine-indicator’
supplies a manual toggle, and the command ‘caffeinate’ can be used
to …
Run Code Online (Sandbox Code Playgroud) 我读过的几乎无处不在,包括谷歌的bash脚本风格指南,提到引用命令替换的必要性(除非当然特别需要).
我理解在一般使用期间引用命令替换的时间/地点/原因.例如:echo "$(cat <<< "* useless string *")"
而不是echo $(...)
但是对于具体的变量赋值,我看到了很多这样的例子:
variable="$(command)"
然而,我发现没有variable=$(command)
不等同的实例.
variable="$(echo "*")"
并将variable=$(echo "*")
值设置为'*'.
任何人都可以给出任何在变量分配期间不加引号的替换实际会导致问题的情况吗?
有没有一种好方法可以在 shell 中对目录内容(包括隐藏文件)进行排序?基本上我希望能够ls
在我的 GUI 文件管理器中完成目录。在典型的目录中,输出如下:
.a_hidden_dir
.b_hidden_dir
.c_hidden_dir
目录
b_目录
c_目录
.a_隐藏文件
.b_隐藏文件
.c_隐藏文件
一份文件
b_文件
c_文件
当然ls
有这个--group-directories-first
选项,但这只能让我们完成部分工作,因为sort
忽略了前导.
,它不会将隐藏文件排序到顶部。
我希望能够以这种方式对ls
、或其他路径列表的输出进行排序。find
有谁知道一个好方法来做到这一点 - 也许是sort -k
KEYDEF?
现在我正在做这样的事情(它假设目录名称附加了斜杠):
pathsort(){
input=$(cat)
(
awk '/^\..+\/$/' <<<"$input" | sort
awk '/^[^.].+\/$/' <<<"$input" | sort
awk '/^\..+[^/]$/' <<<"$input" | sort
awk '/^[^.].+[^/]$/' <<<"$input" | sort
) | sed 's/\/$//'
}
\ls -Ap | pathsort
Run Code Online (Sandbox Code Playgroud)
上面的代码完成了工作,但还远远不够理想。请告诉我有更好的方法...
是否有一种简单的方法来使用--toggle
和--no-toggle
使用Python的argparse标记?
现在我正在使用类似于以下内容的东西:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--toggle',
action='store_true',
dest='toggle')
parser.add_argument('--no-toggle',
action='store_true',
default=True,
dest='notoggle')
options = parser.parse_args([])
Run Code Online (Sandbox Code Playgroud)
我只是手动解析long if链中的可能性,但如果有一种方法可以整理它并且状态由解析器立即存储在一个目标中,那将会很好,例如options.toggle
.这是可行的,如果可行,怎么样?
一个有点相关的答案是Python argparse切换标志但是我有兴趣使用--no-
longopts store_false
切换前缀(类似于-
前面提到的链接中概述的shortopts切换前缀).
有谁知道任何具有良好日志记录实现的模块的好例子?
\n\n我一直在用几种不同的方式进行日志记录,但我不确定哪种方式最Pythonic。
\n\n对于脚本,这就是我一直在做的事情:
\n\nimport logging\n\nLOGGER = logging.getLogger(__program__)\nSTREAM = logging.StreamHandler()\nFORMATTER = logging.Formatter('(%(name)s) %(levelname)s: %(message)s')\nSTREAM.setFormatter(FORMATTER)\nLOGGER.addHandler(STREAM)\n\ndef main():\n LOGGER.warning('This is a warning message.')\n
Run Code Online (Sandbox Code Playgroud)\n\n这是在全局命名空间中执行的,我可以调用LOGGER
从任何地方调用。
对于模块来说,上述解决方案并不是一个好主意,因为代码是在导入时执行的。所以对于模块,我一直称之为_logging()
函数来设置日志记录。
def _logging():\n import logging\n\n global logger\n logger = logging.getLogger(__program__)\n stream = logging.StreamHandler()\n formatter = logging.Formatter('(%(name)s) %(levelname)s: %(message)s')\n stream.setFormatter(formatter)\n logger.addHandler(stream)\n\ndef main():\n _logging()\n logger.warning('This is a warning message.')\n
Run Code Online (Sandbox Code Playgroud)\n\n由于logger
是全局的,我可以在任何需要的地方调用它。然而,pylint
会发出全局变量未定义的警告。它被定义为全局变量记录器 在模块级别未定义 当通过 \xe2\x80\x9cglobal\xe2\x80\x9d 语句定义变量但该变量未在模块范围中定义时使用但我不太确定时使用为什么这是一个问题。
或者我应该打电话给_logger()
尽早调用该函数(减去全局函数),然后在需要的地方创建记录器?
def _logging():\n import logging\n\n …
Run Code Online (Sandbox Code Playgroud)