Вопрос

Вот форма.Точная точная форма появляется дважды в источнике.

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

Надеюсь, что помогает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top