python 正则规则测试 GUI PyQt5
2019-09-07 python 2456

import sys
from PyQt5.QtWidgets import QMainWindow, QWidget, QApplication, QPushButton, QFileDialog, QLineEdit, QHBoxLayout, \
QVBoxLayout, QTextEdit, QDesktopWidget, QLabel, QDateTimeEdit, QCheckBox, QTableView, QHeaderView, \
QAbstractItemView, QMessageBox
from PyQt5.QtCore import QThread, pyqtSignal, QObject, QDateTime, Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem
import os
import time
import re, requests
class CombWidget(QObject):
def __init__(self):
super().__init__()
def combHBox(self, lst: list):
h = QHBoxLayout()
for x, y in lst:
h.addWidget(x, y)
wg = QWidget()
wg.setLayout(h)
return wg
def combHBoxAlign(self, lst: list):
h = QHBoxLayout()
for x, y, align in lst:
h.addWidget(x, y, align)
wg = QWidget()
wg.setLayout(h)
return wg
def combVBox(self, lst: list):
h = QVBoxLayout()
for x, y in lst:
h.addWidget(x, y)
wg = QWidget()
wg.setLayout(h)
return wg
error_index = 0
def get_content(url, charset="utf-8", timeout=30):
global error_index
content = ""
if error_index > 3:
# os.system('cmd/c start novel.exe')
print("%d次错误退出" % error_index)
return
try:
headers = {"User-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
# "Accept-Language":"en-US,en;q=0.5",
"Accept-Encoding": "deflate",
# "Connection":"keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
}
r = requests.get(url, timeout=timeout, headers=headers)
if r.status_code == 200:
content = r.content.decode(charset)
else:
print("Error:", r.status_code)
except Exception as e:
print("Error:", str(e))
print("2秒后重新链接。。。 error_index: %s" % error_index)
time.sleep(2)
error_index += 1
content = get_content(url)
return content
class WorkThread(QThread):
triggerHtml = pyqtSignal(str)
url = ""
def run(self):
print("url:%s" % self.url)
content = get_content(self.url, charset="utf-8")
self.triggerHtml.emit(content)
class Testpattern(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusBar = self.statusBar()
self.setStatusBar(self.statusBar)
self.statusBar.showMessage("初始化 test pattern")
v = QVBoxLayout()
comb = CombWidget()
testcontent_btn = QPushButton("匹配")
testcontent_btn.clicked.connect(self.patContent)
test_btn = QPushButton("匹配")
test_btn.clicked.connect(self.patDetail)
gethtml_btn = QPushButton("获取网页内容")
gethtml_btn.clicked.connect(self.getHtml)
contentp_btn = QPushButton("content")
contentp_btn.clicked.connect(lambda: self.contentpattern_text.insertPlainText('(?P<content>.+?)'))
patbtns = comb.combVBox([(contentp_btn, 1), ])
dcontentp_btn = QPushButton("content")
dtitlep_btn = QPushButton("title")
dimgp_btn = QPushButton("img")
durlp_btn = QPushButton("url")
dcontentp_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('(?P<content>.+?)'))
dtitlep_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('(?P<title>.{1,100}?)'))
dimgp_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('(?P<img>[^>]+?)'))
durlp_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('(?P<url>[^>]+?)'))
dpatbtns = comb.combVBox([(dcontentp_btn, 1), (dtitlep_btn, 1), (dimgp_btn, 1),(durlp_btn, 1), ])
ddiv_btn = QPushButton("[^>]+?")
dcontent_btn = QPushButton(".+")
dcontent1_btn = QPushButton(".*")
dspace_btn = QPushButton("\s+")
dspace1_btn = QPushButton("\s*")
ddiv_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('[^>]+?'))
dcontent_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('.+'))
dcontent1_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('.*'))
dspace_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('\s+'))
dspace1_btn.clicked.connect(lambda: self.pattern_text.insertPlainText('\s*'))
dspacebtns = comb.combVBox([(ddiv_btn, 1), (dcontent_btn, 1),(dcontent1_btn, 1),(dspace_btn, 1),(dspace1_btn, 1), ])
#<a href="(?P<url>[^>]+?)"><img src="(?P<img>[^>]+?)" alt="(?P<title>.{1,100}?)">
self.url_txt = QLineEdit("http://www.jiuaitu.com/learn/")
self.url_txt.setFocus(True)
self.url_txt.setPlaceholderText("请输入网址")
self.ret_text = QTextEdit("")
self.ret_text.setPlaceholderText("网页内容")
self.contentpattern_text = QTextEdit()
self.contentpattern_text.setPlainText(r'<article>(?P<content>.+?)</article>')
self.contentpattern_text.setPlaceholderText("内容规则")
self.contentpattern_text.setFocus(False)
self.contenthtml_text = QTextEdit("")
self.contenthtml_text.setPlaceholderText("匹配内容")
self.pattern_text = QTextEdit("")
self.pattern_text.setPlainText('<img src="(?P<img>[^>]+?)" alt="(?P<title>.{1,100}?)">')
self.pattern_text.setPlaceholderText("详细规则")
self.html_text = QTextEdit("")
self.html_text.setPlaceholderText("匹配内容")
v.addWidget(comb.combHBox([(self.url_txt, 12), (gethtml_btn, 2), ]), 1)
v.addWidget(comb.combHBox([(self.ret_text, 12), ]), 3)
v.addWidget(
comb.combHBoxAlign([(self.contentpattern_text, 12, Qt.AlignVCenter), (patbtns, 1, Qt.AlignTop),
(testcontent_btn, 2, Qt.AlignTop), ]),
1)
v.addWidget(comb.combHBox([(self.contenthtml_text, 12), ]), 5)
v.addWidget(comb.combHBoxAlign(
[(self.pattern_text, 12, Qt.AlignVCenter), (dpatbtns, 1, Qt.AlignTop), (dspacebtns, 1, Qt.AlignTop), (test_btn, 2, Qt.AlignTop), ]),
1)
v.addWidget(comb.combHBox([(self.html_text, 12), ]), 5)
vwg = QWidget()
vwg.setLayout(v)
self.exec_time = time.time()
self.setCentralWidget(vwg)
self.workThread = WorkThread()
self.workThread.triggerHtml.connect(self.showResult)
self.setGeometry(300, 300, 800, 800)
self.center()
self.setWindowTitle("测试规则")
def patContent(self):
# <div class="blogs-list">(?P<content>.+)</div>
print("匹配内容")
try:
pat = self.contentpattern_text.toPlainText()
content = self.ret_text.toPlainText()
print("pattren:%s" % pat)
m = re.search(r"" + pat, content, re.S | re.I)
if m is not None:
dict = m.groupdict()
self.contenthtml_text.setPlainText(dict["content"])
except Exception as e:
self.contenthtml_text.setPlainText(str(e))
print(str(e))
def patDetail(self):
print("匹配详细")
pats = {"content": '\(\?P<content>', "title": '\(\?P<title>', "img": '\(\?P<title>', "url": '\(\?P<url>'}
try:
pat = self.pattern_text.toPlainText()
pats = {"content": '(?P<content>', "title": '(?P<title>', "img": '(?P<img>', "url": '(?P<url>'}
pat_names = []
for x in pats:
if pats.get(x) in pat:
pat_names.append(x)
print("pattren:%s" % pat_names)
content = self.contenthtml_text.toPlainText()
print("pattren:%s" % pat)
# 内容
if content == "":
content = self.ret_text.toPlainText()
m = re.finditer(r"" + pat, content, re.S | re.I)
html = ""
if m is not None:
for dt in m:
for name in pat_names:
html = html + "<%s>:%s \n" % (name, dt.group(name))
html = html +"\n---------------------------------------------------------\n"
self.html_text.setPlainText(html)
except Exception as e:
self.html_text.setPlainText(str(e))
print(str(e))
def showResult(self, text):
self.statusBar.showMessage("请求成功 耗时 %.2f 秒" % (time.time() - self.exec_time))
self.ret_text.setPlainText(text)
def getHtml(self):
self.url = self.url_txt.text()
if self.url.strip() == "":
QMessageBox.warning(self, "提示", "URL网址不能为空", QMessageBox.Yes | QMessageBox.No)
return
self.statusBar.showMessage("请求URL:%s" % self.url)
self.workThread.url = self.url
self.exec_time = time.time()
self.workThread.start()
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Testpattern()
ex.show()
sys.exit(app.exec_()) 很赞哦! (0)
相关文章
文章评论
-
-
-
0条评论