python - analyser formulaire html avec lxml.html avec la syntaxe xpath
Question
Voici le formulaire.De la même forme exacte apparaît deux fois dans la source.
<form method="POST" action="/login/?tok=sess">
<input type="text" id="usern" name="username" value="" placeholder="Username"/>
<input type="password" id="passw" name="password" placeholder="Password"/>
<input type="hidden" name="ses_token" value="token"/>
<input id="login" type="submit" name="login" value="Log"/>
</form>
Je suis l'attribut "action" avec ce code py
import lxml.html
tree = lxml.html.fromstring(pagesource)
print tree.xpath('//action')
raw_input()
Puisqu'il y a deux formes, il imprime à la fois des attributs
['/login/?session=sess', '/login/?session=sess']
Comment puis-je l'obtenir à l'impression d'un seul?J'ai seulement besoin d'un, car ils sont de la même forme exacte.
J'ai aussi une deuxième question
comment puis-je obtenir la valeur du jeton?Je parle de cette ligne:
<input type="hidden" name="ses_token" value="token"/>
J'essaie de code similaire,
import lxml.html
tree = lxml.html.fromstring(pagesource)
print tree.xpath('//value')
raw_input()
Cependant, depuis plus d'un attribut nommé valeur, il permet d'imprimer
['', 'token', 'Log In', '', 'token', 'Log In'] # or something close to that
Comment puis-je obtenir juste le jeton?Et juste?
Est-il une meilleure façon de le faire?
La solution
Utilisation find()
au lieu de xpath()
, depuis find()
retourne uniquement le premier match.
Voici un exemple basé sur le code que vous avez fournies:
import lxml.html
pagesource = """<form method="POST" action="/login/?session=sess">
<input type="text" id="usern" name="username" value="" placeholder="Username"/>
<input type="password" id="passw" name="password" placeholder="Password"/>
<input type="hidden" name="ses_token" value="token"/>
<input id="login" type="submit" name="login" value="Log In"/>
</form>
<form method="POST" action="/login/?session=sess">
<input type="text" id="usern" name="username" value="" placeholder="Username"/>
<input type="password" id="passw" name="password" placeholder="Password"/>
<input type="hidden" name="ses_token" value="token"/>
<input id="login" type="submit" name="login" value="Log In"/>
</form>
"""
tree = lxml.html.fromstring(pagesource)
form = tree.find('.//form')
print "Action:", form.action
print "Token:", form.find('.//input[@name="ses_token"]').value
Impressions:
Action: /login/?session=sess
Token: token
Espérons que cela aide.