Python - Parse HTML-форма с LXML.HTML с синтаксисом XPate
Вопрос
Вот форма.Точная точная форма появляется дважды в источнике.
<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>
.
Я получаю атрибут «Действия» с помощью этого PY Code
import lxml.html
tree = lxml.html.fromstring(pagesource)
print tree.xpath('//action')
raw_input()
.
Поскольку есть две формы, он печатает оба атрибута
['/login/?session=sess', '/login/?session=sess']
.
Как я могу заставить его печатать только один?Мне нужен только один, так как они одинаковые точные формы.
У меня также есть второй вопрос
Как я могу получить значение токена? Я говорю об этой строке:
<input type="hidden" name="ses_token" value="token"/>
.
Я пробую похожий код,
import lxml.html
tree = lxml.html.fromstring(pagesource)
print tree.xpath('//value')
raw_input()
.
Тем не менее, поскольку более одного атрибута с именем значения, он распечатает
['', 'token', 'Log In', '', 'token', 'Log In'] # or something close to that
.
Как я могу получить только токен?И только один?
Есть лучший способ сделать это?
Решение
Используйте find()
вместо xpath()
, поскольку find()
возвращает только первый матч.
Вот пример, основанный на указанном вами коде:
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
.
Печать:
Action: /login/?session=sess
Token: token
.
Надеюсь, что помогает.