本文共 4230 字,大约阅读时间需要 14 分钟。
在中,笔者已经介绍了如何利用Python爬虫来制作一个简单的搜索引擎。我们将继续这个工作,来建立一个该搜索引擎的GUI版本,来获得更好地搜索体验。
主要程序还是中的搜索程序,在此基础上加入UI设计,得到图形化操作界面。 直接上程序!def introduction(self,citiao): # 詞條的百度百科簡介部分函數 url = 'https://baike.baidu.com/item/'+urllib.parse.quote(citiao) # 讀取網頁 html = urllib.request.urlopen(url) content = html.read().decode('utf-8') html.close() #網頁解析 soup = BeautifulSoup(content, "lxml") text = soup.find('div', class_="lemma-summary").children #簡介部分 intro_text='' #文本處理,主要利用正則表達式 for x in text: word = re.sub(re.compile(r"<(.+?)>"),'',str(x)) words = re.sub(re.compile(r"\[(.+?)\]"),'',word) intro_text += words return intro_text # 返回文本(str格式)
该段代码与上一篇分享类似,就不在具体讲述,主要功能为:输入参数为citiao,得到该词条的百度百科的简介部分的文字。
def intro_final(self,citiao): # 異常處理函數 try: return self.introduction(citiao) except AttributeError: return "请再输入详细点,亲~~"
intro_final()为异常处理函数,如果introduction()函数没有搜索到结果,则提示输入详细点,因为某个词条可能存在多义词。
def initUI(self): #GUI布局及控件放置 search_label = QLabel("请输入搜索词条:") search_item = QLineEdit() btn1 = QPushButton("开始搜索", self) btn2 = QPushButton("清空", self) search_result = QTextEdit() grid = QGridLayout() grid.setSpacing(5) grid.addWidget(search_label, 1, 0) grid.addWidget(search_item,2, 0) grid.addWidget(btn1, 3, 0) grid.addWidget(btn2, 3, 1) grid.addWidget(search_result, 4, 0, 5, 0) self.setLayout(grid) #爲兩個按鈕關聯處理函數,當按下“開始搜索”按鈕開始開搜並輸出,當按下“清空”清空內容 def searching(): search_result.setText(self.intro_final(search_item.text())) btn1.clicked.connect(searching) def clear(): search_result.setText("") search_item.setText("") btn2.clicked.connect(clear) #設置窗口 self.setGeometry(400, 150, 600, 500) self.setWindowTitle("搜索引擎GUI")
该段代码主要是利用PyQt5模块来设计GUI界面,图形化界面如下:
# -*- coding: utf-8 -*-import sysimport reimport bs4import urllib.request from bs4 import BeautifulSoup import urllib.parsefrom PyQt5.QtWidgets import (QPushButton,QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout,QApplication)class Example(QWidget): def __init__(self): # 初始化 super().__init__() self.initUI() def introduction(self,citiao): # 詞條的百度百科簡介部分函數 url = 'https://baike.baidu.com/item/'+urllib.parse.quote(citiao) # 讀取網頁 html = urllib.request.urlopen(url) content = html.read().decode('utf-8') html.close() #網頁解析 soup = BeautifulSoup(content, "lxml") text = soup.find('div', class_="lemma-summary").children #簡介部分 intro_text='' #文本處理,主要利用正則表達式 for x in text: word = re.sub(re.compile(r"<(.+?)>"),'',str(x)) words = re.sub(re.compile(r"\[(.+?)\]"),'',word) intro_text += words return intro_text # 返回文本(str格式) def intro_final(self,citiao): # 異常處理函數 try: return self.introduction(citiao) except AttributeError: return "请再输入详细点,亲~~" def initUI(self): #GUI布局及控件放置 search_label = QLabel("请输入搜索词条:") search_item = QLineEdit() btn1 = QPushButton("开始搜索", self) btn2 = QPushButton("清空", self) search_result = QTextEdit() grid = QGridLayout() grid.setSpacing(5) grid.addWidget(search_label, 1, 0) grid.addWidget(search_item,2, 0) grid.addWidget(btn1, 3, 0) grid.addWidget(btn2, 3, 1) grid.addWidget(search_result, 4, 0, 5, 0) self.setLayout(grid) #爲兩個按鈕關聯處理函數,當按下“開始搜索”按鈕開始開搜並輸出,當按下“清空”清空內容 def searching(): search_result.setText(self.intro_final(search_item.text())) btn1.clicked.connect(searching) def clear(): search_result.setText("") search_item.setText("") btn2.clicked.connect(clear) #設置窗口 self.setGeometry(400, 150, 600, 500) self.setWindowTitle("搜索引擎GUI")if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_())