python - analisa o formulário HTML com lxml.html com sintaxe xpath
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?
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.