Парсер нескольких html страниц на qt

963 просмотра
0
0 Комментариев

Доброго дня! Делаю парсер для личных нужд и учусь программировать потихоньку.

Идея такая, вставляю из экселя список ссылок на сайты (они однообразны), ну например market.yandex.ru — есть 10-20 ссылок. Как в питоне обозначить этот список? я бы хотел его вводить в какой то texteditor, в окне Qt, далее нажимаю парсим — и программа загружает нужные странички.

.py парсер тут
http://pastebin.ru/RjDPll8T
Qt интерфейс для него тут:
http://pastebin.com/mG7Kxbtp


Добавить комментарий

2 Answers

Python Опубликовано 14.12.2018
0

Самый простой вариант: используйте QPlainTextEdit для хранения списка url — каждый url на своей строке. При нажатии на кнопку, получаете текст из редактора, разделяете его по символу перевода на следующую строку '\n' и обрабатываете url:

for url in self.ui.urls_text_edit.toPlainText().split('\n'):
    # Удаление пустых символов с края строки
    url = url.strip()
 
    # Если строка пустая
    if not url:
        continue
 
    seld.do_parse(url)

Для парсинга сайтов нужно что-то для скачивания страницы по url и что-то для вытаскивания информации со скаченной страницы, это может быть простой поиск по тексту, или поиск с помощью регулярных выражений, или разбор страницы как xml (html) и получения данных использую sax, dom, css-селекторы, или xpath.
Css-селекторы и xpath выражения по сути одно и тоже — ими описывается какие объекты из страницы html хотим получить.

Рекомендую, использовать xml-парсер с xpath запросами, вот пример скрипта для вытаскивания меток ru.stackoverflow с первой страницы. В g.doc.select описывается xpath выражения для получения ссылок на метки:

import grab
g = grab.Grab()
 
url = 'http://ru.stackoverflow.com/tags?tab=name'
g.go(url)
 
for a in g.doc.select('//a[@class="post-tag"]'):
    tag = a.text()
    print(tag)


Опишу наиболее частые инструменты.

Для скачивания страниц: стандартный urllib или requests.

Для парсинга: lxml, beautifulsoup или grab.


Иногда, на некоторых сайтах, на которых активно используются скрипты, парсить описанным выше способом не получится, и тогда я использую движок Webkit, входящий в Qt как модуль QWebKit. Кстати, в нем поиск происходит с помощью css-селекторов, они по проще xpath. В этом примере заходим на страницу ru.stackoverflow и получаем текст с label:

from PySide.QtWebKit import *
from PySide.QtCore import *
from PySide.QtGui import *
 
import sys
 
app = QApplication(sys.argv)
 
view = QWebView()
view.show()
view.load('https://ru.stackoverflow.com/users/login')
 
# Ждем пока прогрузится страница
loop = QEventLoop()
view.loadFinished.connect(loop.quit)
loop.exec_()
 
doc = view.page().mainFrame().documentElement()
print(doc.findFirst('label[for="email"]').toPlainText())
print(doc.findFirst('label[for="password"]').toPlainText())
 
sys.exit(app.exec_())


Ссылки на некоторые мои скрипты для парсинга:

Добавить комментарий
0

Для начинающих (как я), всем рекомендую посмотреть вот этот урок https://www.youtube.com/watch?v=BBDwd32Vwtg он весьма подробно объясняет как сделать парсер страниц (страницу директории и подстраницы), а так же выгрузить все это дело в Excel. Удобно так как все это в одном месте. Смотря обрывки уроков по парсингу от «ведущих» западных коллег — к сожалению собрать все в одну программу для новичков как я тяжело, без должной базы знаний.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up