python — анализировать html-форму с помощью lxml.html с синтаксисом xpath

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

<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

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

Как я могу получить только токен? И только один?

Есть лучший способ сделать это?


person user3196332    schedule 25.02.2014    source источник


Ответы (1)


Используйте 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

Надеюсь, это поможет.

person alecxe    schedule 25.02.2014