2010-06-26 5 views
1

J'essaye d'analyser une forme html using la mécanisation. Le formulaire lui-même a un nombre arbitraire de champs cachés et les noms de champs et les identifiants sont générés de façon aléatoire, donc je n'ai aucun moyen évident de les sélectionner directement. Il est clair que l'utilisation d'un nom ou d'un identifiant est désactivée, et en raison du nombre aléatoire de champs masqués, je ne peux pas les sélectionner en fonction du numéro de séquence, car cela change toujours aussi.Un champ de formulaire peut-il être sélectionné avec mécanisation en fonction du type du champ (par exemple TextControl, TextareaControl)?

Cependant, il y a toujours deux champs TextControl l'un après l'autre, et ensuite un TextareaControl. Ce sont les 3 champs auxquels j'ai besoin d'accéder aussi, fondamentalement je dois analyser leurs noms et tout va bien. J'ai regardé à travers la documentation mécanisée pour les deux dernières heures et n'ai pas trouvé quelque chose qui semble être en mesure de le faire, aussi simple que cela puisse paraître (pour moi de toute façon). J'ai proposé une autre solution qui consiste à faire une liste des contrôles de formulaire, en itérant à travers elle pour trouver les contrôles qui contiennent la chaîne 'Text' en retournant une nouvelle liste de ceux-ci, puis en retirant finalement le nom en utilisant une expression régulière. Bien que cela fonctionne, il semble inutile et je me demande s'il existe une solution plus élégante. Merci les gars.

edit: Voici ce que je fais actuellement pour extraire cette information si quelqu'un est curieux. Je pense que je vais probablement m'en tenir à ça. Cela ne semble pas nécessaire, mais le travail est fait et ce n'est rien d'intensif, donc je ne m'inquiète pas pour l'efficacité ou quoi que ce soit.

def formtextFieldParse(browser): 
'''Expects a mechanize.Browser object with a form already selected. Parses 
through the fields returning a tuple of the name of those fields. There 
SHOULD only be 3 fields. 2 text followed by 1 textarea corresponding to 
Posting Title, Specific Location, and Posting Description''' 
import re 
pattern = '\(.*\)' 
fields = str(browser).split('\n') 
textfields = [] 
for field in fields: 
    if 'Text' in field: textfields.append(field) 
titleFieldName = re.findall(pattern, textfields[0])[0][1:-2] 
locationFieldName = re.findall(pattern, textfields[1])[0][1:-2] 
descriptionFieldName = re.findall(pattern, textfields[2])[0][1:-2] 
+0

On dirait que vous essayez de faire un bot pour vaincre les techniques anti-botting courantes discrètes –

+0

Je ne sais pas si vous le considérez comme un bot, mais j'essaie juste de faire un programme pour gérer ma craigslist annonces parce que j'oublie toujours de les rediffuser. Je ne suis pas en train de spammer ou d'abuser de quoi que ce soit (bien que j'avoue que je suis probablement en train de casser les fesses), je lance juste une publicité régulière pour mon entreprise et parfois je vends quelque chose là-bas. – kryptobs2000

Répondre

1

Je ne pense pas mechanize a la fonctionnalité exacte dont vous avez besoin; pourriez-vous utiliser mechanize pour obtenir la page HTML, puis analyser ce dernier par exemple avec BeautifulSoup?

+0

Ah, merci bien. Je ne vais probablement pas me pencher sur ce projet car il a fallu assez de temps pour apprendre à mécaniser (vraiment pas très longtemps, mais c'est la première bibliothèque non incluse que j'ai vraiment appris à utiliser jusqu'à présent). Selon ce que je fais ensuite, je pourrais bien l'explorer. – kryptobs2000

Questions connexes