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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top