Pregunta

Aquí está la forma.La misma forma exacta aparece dos veces en la fuente.

<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>

Estoy recibiendo el atributo "acción" con este código PY

import lxml.html
tree = lxml.html.fromstring(pagesource)
print tree.xpath('//action')
raw_input()

Dado que hay dos formas, imprime ambos atributos

['/login/?session=sess', '/login/?session=sess']

¿Cómo puedo conseguirlo para imprimir solo uno?Solo necesito uno, ya que son la misma forma exacta.

También tengo una segunda pregunta

¿Cómo puedo obtener el valor del token? Estoy hablando de esta línea:

 <input type="hidden" name="ses_token" value="token"/>

Intento código similar,

import lxml.html
tree = lxml.html.fromstring(pagesource)
print tree.xpath('//value')
raw_input()

Sin embargo, dado que es más de un atributo con nombre de valor, se imprimirá

['', 'token', 'Log In', '', 'token', 'Log In'] # or something close to that

¿Cómo puedo obtener el token?¿Y solo uno?

¿Hay una mejor manera de hacer esto?

¿Fue útil?

Solución

Use find() en lugar de xpath(), ya que find() devuelve solo la primera coincidencia.

Aquí hay un ejemplo basado en el código que ha proporcionado:

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

Impresiones:

Action: /login/?session=sess
Token: token

espero que ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top