Hola, buen día !
Sigo con mis prácticas en Python + QT4. Posterior a esto seguiré con el tutorial que estuve escribiendo para RootCodes... En esta oportunidad he traspasado este código en consola ~> [Python]Detectar formulario y campos de un sitio web (http://rootcodes.com/pythondetectar-formulario-y-campos-de-un-sitio-web/) a PyQT. Así aprovechando de utilizar QTreeWidget(); Para aprender a usarlo y a la vez que ustedes vean como se usa.
Un ScreenShot de la App :
(http://rootcodes.com/imagenes/Pantallazo-Detectar%20campos%20de%20un%20formulario%20%7C%200x5d.png)
Y el Código :
# -*- coding: utf-8 -*-
# Autor ~> JaAViEr|0x5d
# Sitio Web ~> http://www.rootcodes.com
# Twitter ~> @0x5d
from PyQt4 import QtCore, QtGui
import sys, urllib, re
class aplica(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle("Detectar campos de un formulario | 0x5d")
self.resize(510,570)
self.arbol = QtGui.QTreeWidget(self)
self.arbol.setGeometry(5,70,500,500)
self.label_url = QtGui.QLabel("URL/Host :", self).setGeometry(5,10,64,27)
self.input_url = QtGui.QLineEdit(self)
self.input_url.setGeometry(73,10,430,27)
self.boton = QtGui.QPushButton("Extraer campos del formulario",self)
self.boton.setGeometry(73,40,430,27)
self.connect(self.boton, QtCore.SIGNAL("clicked()"), self.extractor)
self.arbol.headerItem().setText(0,"Campos")
def extractor(self):
var = urllib.urlopen(str(self.input_url.text())).read()
datos_r = []
for campos in re.findall("<input (.*)>",var):
if "name" in campos.lower():
for cam in campos.split():
if re.findall("name=(.*)",cam):
datos_r.append(cam.replace('"',""))
#print "URL a enviar POST:",url_enviar.replace(">","")
for x,y in enumerate(datos_r):
exec("primer_%s = QtGui.QTreeWidgetItem(self.arbol)"%x)
exec("self.arbol.topLevelItem(%s).setText(0, \"%s\")"%(x,y.replace("name=","")))
app = QtGui.QApplication(sys.argv)
form = aplica()
form.show()
app.exec_()
Fuente: http://rootcodes.com/pyqt4detectar-campos-de-un-formulario-web/
Saludos, Javier.
Bueno es :D.
He estado mirando tus tutoriales y te agradecería que los explicases sin clases de por medio si es posible, implementar clases en tutoriales es bastante lioso :D.
De todas formas Qt4 parece bastante potente en cuanto a interfaces no? :)
Cita de: Runex en 8 Abril 2012, 16:23 PM
Bueno es :D.
He estado mirando tus tutoriales y te agradecería que los explicases sin clases de por medio si es posible, implementar clases en tutoriales es bastante lioso :D.
De todas formas Qt4 parece bastante potente en cuanto a interfaces no? :)
Hola, buen día !
Pues la verdad para QT4 es necesario usar clases, pero bueno, enseguida te explico el código a mi forma :P:
from PyQt4 import QtCore, QtGui
import sys, urllib, re
No creo que sea necesario explicar eso :P
self.setWindowTitle("Detectar campos de un formulario | 0x5d")
Le damos un titulo a nuestra ventana(self(el mismo form))
self.resize(510,570)
Le damos las dimensiones self.resize(ancho,altura)
self.arbol = QtGui.QTreeWidget(self)
Creamos el Objeto QTreeWidget(); al poner 'self' dentro indico que se insertará en el mismo formulario y no en otro.
self.arbol.setGeometry(5,70,500,500)
Le doy las propiedades de ubicación y ancho-alto. setGeometry(x,y,ancho,alto)
self.label_url = QtGui.QLabel("URL/Host :", self).setGeometry(5,10,64,27)
Creo un Label para insertar un mensaje en el formulario, seguido le doy propiedades de ubicación y dimensiones
self.input_url = QtGui.QLineEdit(self)
Creo el QLineEdit(); para poder escribir.
self.input_url.setGeometry(73,10,430,27)
Le doy dimensiones y ubicación al QLineEdit();
self.boton = QtGui.QPushButton("Extraer campos del formulario",self)
Creo un Botón
self.boton.setGeometry(73,40,430,27)
Le doy propiedades de ubicación y dimensión al botón
self.connect(self.boton, QtCore.SIGNAL("clicked()"), self.extractor)
Le digo al programa que al dar clic
(QtCore.SIGNAL("clicked()")) en
self.boton , nos dirija a la función
def extractor() self.arbol.headerItem().setText(0,"Campos")
Con esto señalo la cabecera del QTreeWidget(); que luego los elementos aparecerán abajo. En este caso "Campos" (como ves en la imagen anterior)
def extractor(self):
La función extractor que llamé desde
self.connect() var = urllib.urlopen(str(self.input_url.text())).read()
Con
str(self.input_url.text()) Obtengo el texto insertado en el
QLineEdit() y lo abrimos con
urllib.urlopen datos_r = []
for campos in re.findall("<input (.*)>",var):
if "name" in campos.lower():
for cam in campos.split():
if re.findall("name=(.*)",cam):
datos_r.append(cam.replace('"',""))
Con eso obtengo los campos input del sitio web insertado, es cosa de saber
Python, nada que ver con
QT4for x,y in enumerate(datos_r):
exec("primer_%s = QtGui.QTreeWidgetItem(self.arbol)"%x)
exec("self.arbol.topLevelItem(%s).setText(0, \"%s\")"%(x,y.replace("name=","")))
Ahí es un poco más complicado el caso, puesto que para cada elemento a insertar en nuestro QTreeWidget(); Necesitamos una variable que contenga a este elemento. Uso
for x,y enumerate(datos_r): para contabilizar cuantos campos encontró el programa y su valor. Que mediante el primer
exec() creo una variable para cada elemento, quedando :
primer_0 = ...
primer_1 = ...
Pero dependiendo de cuanto elemento sea encontrado.
Posteriormente
exec("self.arbol.topLevelItem(%s).setText(0, \"%s\")"%(x,y.replace("name=","")))
self.arbol.topLevelItem(%s) será:
self.arbol.topLevelItem(0)
self.arbol.topLevelItem(1)
self.arbol.topLevelItem(2)
etc Dependiendo de cuanto elemento se encuentra.
Luego con .setText(); insertamos el valor en la posición indicada por el x que contámos con enumerate();
app = QtGui.QApplication(sys.argv)
form = aplica() # Instancia a la clase aplica()
form.show() # Mostramos el formulario que es aplica()
app.exec_() # Corremos la aplicación
Intenté ser lo más claro posible y explicar línea por línea jaja
Saludos !
Cita de: 0x5d en 8 Abril 2012, 20:17 PM
Hola, buen día !
Pues la verdad para QT4 es necesario usar clases, pero bueno, enseguida te explico el código a mi forma :P:
from PyQt4 import QtCore, QtGui
import sys, urllib, re
No creo que sea necesario explicar eso :P
self.setWindowTitle("Detectar campos de un formulario | 0x5d")
Le damos un titulo a nuestra ventana(self(el mismo form))
self.resize(510,570)
Le damos las dimensiones self.resize(ancho,altura)
self.arbol = QtGui.QTreeWidget(self)
Creamos el Objeto QTreeWidget(); al poner 'self' dentro indico que se insertará en el mismo formulario y no en otro.
self.arbol.setGeometry(5,70,500,500)
Le doy las propiedades de ubicación y ancho-alto. setGeometry(x,y,ancho,alto)
self.label_url = QtGui.QLabel("URL/Host :", self).setGeometry(5,10,64,27)
Creo un Label para insertar un mensaje en el formulario, seguido le doy propiedades de ubicación y dimensiones
self.input_url = QtGui.QLineEdit(self)
Creo el QLineEdit(); para poder escribir.
self.input_url.setGeometry(73,10,430,27)
Le doy dimensiones y ubicación al QLineEdit();
self.boton = QtGui.QPushButton("Extraer campos del formulario",self)
Creo un Botón
self.boton.setGeometry(73,40,430,27)
Le doy propiedades de ubicación y dimensión al botón
self.connect(self.boton, QtCore.SIGNAL("clicked()"), self.extractor)
Le digo al programa que al dar clic(QtCore.SIGNAL("clicked()")) en self.boton , nos dirija a la función def extractor()
self.arbol.headerItem().setText(0,"Campos")
Con esto señalo la cabecera del QTreeWidget(); que luego los elementos aparecerán abajo. En este caso "Campos" (como ves en la imagen anterior)
def extractor(self):
La función extractor que llamé desde self.connect()
var = urllib.urlopen(str(self.input_url.text())).read()
Con str(self.input_url.text()) Obtengo el texto insertado en el QLineEdit() y lo abrimos con urllib.urlopen
datos_r = []
for campos in re.findall("<input (.*)>",var):
if "name" in campos.lower():
for cam in campos.split():
if re.findall("name=(.*)",cam):
datos_r.append(cam.replace('"',""))
Con eso obtengo los campos input del sitio web insertado, es cosa de saber Python, nada que ver con QT4
for x,y in enumerate(datos_r):
exec("primer_%s = QtGui.QTreeWidgetItem(self.arbol)"%x)
exec("self.arbol.topLevelItem(%s).setText(0, \"%s\")"%(x,y.replace("name=","")))
Ahí es un poco más complicado el caso, puesto que para cada elemento a insertar en nuestro QTreeWidget(); Necesitamos una variable que contenga a este elemento. Uso for x,y enumerate(datos_r): para contabilizar cuantos campos encontró el programa y su valor. Que mediante el primer exec() creo una variable para cada elemento, quedando :
primer_0 = ...
primer_1 = ...
Pero dependiendo de cuanto elemento sea encontrado.
Posteriormente exec("self.arbol.topLevelItem(%s).setText(0, \"%s\")"%(x,y.replace("name=","")))
self.arbol.topLevelItem(%s) será:
self.arbol.topLevelItem(0)
self.arbol.topLevelItem(1)
self.arbol.topLevelItem(2)
etc Dependiendo de cuanto elemento se encuentra.
Luego con .setText(); insertamos el valor en la posición indicada por el x que contámos con enumerate();
app = QtGui.QApplication(sys.argv)
form = aplica() # Instancia a la clase aplica()
form.show() # Mostramos el formulario que es aplica()
app.exec_() # Corremos la aplicación
Intenté ser lo más claro posible y explicar línea por línea jaja
Saludos !
0x5d, una verdadera máquina voy a cambiar de Tkinter a éste para probar cosas nuevas :).
Un saludo y buena explicacion compañero ;-)
Un gusto poder 'enseñar' ! :D
Mira lo que he encontrado :)
http://www.slideshare.net/jpadillaa/primeros-pasos-en-pyqt4
Creo que está bastante bien para empezar no? ;-)