Pergunta

Aqui está o formulário.A mesma forma exata aparece duas vezes na fonte.

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

Estou recebendo o atributo "action" com este código py

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

Como existem dois formulários, ele imprime ambos os atributos

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

Como posso imprimir apenas um?Eu só preciso de um, já que eles têm exatamente a mesma forma.

Eu também tenho uma segunda pergunta

como posso obter o valor do token?Estou falando desta linha:

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

Eu tento um código semelhante,

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

Porém, como há mais de um atributo denominado valor, ele imprimirá

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

Como posso obter apenas o token?E apenas um?

Existe uma maneira melhor de fazer isso?

Foi útil?

Solução

Usar find() em vez de xpath(), desde find() retorna apenas a primeira correspondência.

Aqui está um exemplo baseado no código que você forneceu:

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

Impressões:

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

Espero que ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top