PyQt5 GUI + Simple Parser

Пытаюсь написать простой парсер на BeatifulSoup и подключить к нему Gui на PyQt5. Парсер готов, и все работает как надо, а вот с Gui никак не могу разобраться. Конкретно проблема в связке parser.py и gui.py. (я новичок, поэтому прошу не ругаться за кривой код) Вот код парсера :

from selenium import webdriver
import time
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome(chrome_options=options)

def main():
  i=0
  kl = 0
  n = input('Нужна ссылка? +/- ')
  j = int(input('Сколько страниц отобразить? '))
  baseurl = input('Введите ссылку ')
  while i <= j-1:
    i = i+1
    p = '#p'
    pop = '_popular_desc'
  for kl in range(j):
    kl = kl +1
    prime = p+str(kl)+pop
    url = baseurl + prime
    browser.get(url)
    time.sleep(0.8) 
    requiredHtml = browser.page_source
    soup = BeautifulSoup(requiredHtml, 'html.parser')
    items = soup.find_all('a' , class_='market_listing_row_link')
    lots = []
    print (' ')
    for item in items:
      lot1 = item.find('span',class_='market_listing_item_name').text,item.find('span', 
class_="market_table_value normal_price").find_next('span' , 
class_='normal_price').text,item.find('div',class_='market_listing_row market_recent_listing_row 
market_listing_searchresult').find_previous('a',class_='market_listing_row_link').get('href')
 lot2 = item.find('span',class_='market_listing_item_name').text,item.find('span', 
class_="market_table_value normal_price").find_next('span' , class_='normal_price').text
     if n == '+':
       print(lot1)

     elif n == '-':
       print(lot2)

 else:
      print('Парсинг окончен')


def proxy():
    pr = input('Хотите использовать прокси? +/- ')
    if pr == '-':
      main()
    elif pr == '+':
      PROXY = input('Введите Прокси ')
      options.add_argument('--proxy-server=%s' % PROXY)

main()
proxy()
input('Введите Enter для выхода ')

А вот gui.py

from PyQt5 import QtWidgets
from parseui import Ui_MainWindow  # импорт нашего сгенерированного файла
import sys
import parser

class mywindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(mywindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.ButClick)

    def ButClick(self):
         parser.main()

app = QtWidgets.QApplication([])
application = mywindow()
application.show()
sys.exit(app.exec())

введите сюда описание изображения

В parser.py Есть переменные (n , j , baseurl) Их я хотел бы вводить через графический интерфейс( lineEdit,lineEdit_2 и т.д) но как это сделать не понимаю, ведь в gui.py есть import parser, а значит в parser я уже не смогу прописать import gui.


Ответы (2 шт):

Автор решения: eri

В простых случаях. Вернул

def main(n , j , baseurl):
   ....
   lots = []
   for item in items:
      ...
      lots.append(lot)

   return lots

Принял

def ButClick(self):
    n = 
    j = ...
    baseurl = self.ui.lineEdit.text()
    lots = parser.main(n , j , baseurl)
    textArea.setText(str(lots))

Но если надо каждую итерацию их обновлять, то нужно передать колбэк функцию

в parser.py

def main(cb, n , j , baseurl):
   ....
   while ...
       for ....
           for ....
               cb(lot)

... в gui.py

def ButClick(self):
     parser.main(self.Update, n , j , baseurl)

def Update(self, lot):
    self.ui.textArea.appendText(lot)
    QtWidgets.QApplication.processEvents()

input() убираешь, принт меняешь на cb(...)

→ Ссылка
Автор решения: Alexander Chernin

Пару примеров для демонстрации принципа:

class mywindow(QtWidgets.QMainWindow):
    ...
    def ButClick(self):
        # Берем значение url из соответствующего компонента вашего GUI
        res = parser.main( self.ui.lineEdit.text(), <другие аргументы>  ) # Так передаем baseurl
        self.ui.textEdit.setText(<Вывод результата парсинга>)

        # Установлена ли галочка Использования прокси
        parser.proxy( self.ui.checkBoxUseProxy.isChecked(), <другие аргументы> ) # Используем ли прокси
        # и так далее

Теперь надо добавить соответствующие аргументы в функции и убрать из них input'ы:

def main(baseurl):
    ...
    return lot1, lot2

def proxy(use):
    if use:
        ...
    else:
        ...
    return ...
→ Ссылка