Frage

Hier ist das Formular.Dieselbe exakte Form erscheint zweimal in der Quelle.

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

Ich erhalte das Attribut "Aktion" mit diesem py-Code

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

Da es zwei Formulare gibt, werden beide Attribute gedruckt

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

Wie kann ich es dazu bringen, nur einen zu drucken?Ich brauche nur einen, da sie genau die gleiche Form haben.

Ich habe auch eine zweite Frage

wie kann ich den Wert des Tokens ermitteln?Ich spreche über diese Linie:

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

Ich versuche ähnlichen Code,

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

Da jedoch mehr als ein Attribut mit dem Namen value , wird es ausgedruckt

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

Wie kann ich nur den Token bekommen?Und nur einer?

Gibt es einen besseren Weg, dies zu tun?

War es hilfreich?

Lösung

Verwenden find() statt xpath(), da find() gibt nur die erste Übereinstimmung zurück.

Hier ist ein Beispiel, das auf dem von Ihnen angegebenen Code basiert:

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

Abdrucken:

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

Hoffe das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top